c++ 高精度 加減乘除 四則運算 代碼實現


很久以前寫的啦
記得寫了好久好久一直卡在特例的數據上面
想起都心塞

那時候變量和數組的取名對我來說簡直是個大難題啊
完全亂來 abcdef就一路排下來
自己看的時候都搞不懂分別代表什么
好在后來英語學的越來越好了
這也算是學c++的附帶好處叭
而且格式也寫得非常丑…
我翻出來的時候各種字符都挨在一起密密麻麻…
真是搞不懂那時候怎么想的
稍微補了下空格但其它地方就懶得改啦
見諒

不過我當時居然寫了注釋…
太神奇了
^^

其實只要自己手動模擬一下小學的豎式乘加減和除法
思考一下 下標關系 和 進位處理 就會發現還是很簡單的啦
坑的地方我現在還依稀記得兩個
一個是減法 被減數比減數小的情況要特判加負號
一個是前綴零的處理 但是要特判答案為0的情況

還有做除法的時候 被除數比除數小或者除數為0的時候可以直接輸0 節約時間

不過我除法做的方法不太常規…雖然說我也不知道常規應該咋寫^^

加法

#include<bits/stdc++.h>
#include<cstring>
using namespace std;

char s1[300] , s2[300] ;
int c[300] , ans , t , a[300] , b[300] ;

int main()
{

    memset(a , 0 , sizeof(a));
    memset(b , 0 , sizeof(b));
    memset(c , 0 , sizeof(c));
    gets(s1) ;
    gets(s2) ;
    int len1 = strlen(s1) , len2 = strlen(s2) , len3 = 1 ;
    for(int i = 1 ; i <= len1 ; ++ i ) 
        a[i] = s1[len1 - i] - '0' ;
    for(int i = 1 ; i <= len2 ; ++ i ) 
        b[i] = s2[len2 - i] - '0' ;
    while(len3 <= len1 || len3 <= len2)
    {
        ans = a[len3] + b[len3] ;
        c[len3] = (ans + t) % 10 ;
        t = (ans + t) / 10 ;
        ++ len3 ;
    }
    if(t != 0) 
        c[len3] = t ;
    while(c[len3] == 0 && len3 > 1) -- len3 ; //刪除前導0
    for(int i = len3 ; i >= 1 ; -- i )
    cout << c[i] ;
    return 0;
}

減法

#include<bits/stdc++.h>
using namespace std;

char s1[300] , s2[300] , s3[300] ;
int c[300] , ans , t=0 , a[300] , b[300] ;

int main()
{
    memset(a , 0 , sizeof(a)) ;
    memset(b , 0 , sizeof(b)) ;
    memset(c , 0 , sizeof(c)) ;
    gets(s1) ;
    gets(s2) ;  
    int len1 = strlen(s1) , len2 = strlen(s2) , len3 = 1 , len4 ;
    //if(len2>len1||(len2==len1)&&(strcmp(s1,s2)<0)) 
        //strcpy(s3,s1),strcpy(s1,s2),strcpy(s2,s3),cout<<"-",len4=len1,len1=len2,len2=len4; //這里是處理減數比被減數大的情況
    for(int i = 1 ; i <= len1 ; ++ i ) a[i] = s1[len1 - i] - '0' ; 
    for(int i = 1 ; i <= len2 ; ++ i ) b[i] = s2[len2 - i] - '0' ;
    while(len3 <= len1 || len3 <= len2)
    {
        ans = a[len3] - b[len3] - t ;//t是前一個數借的數
        t = 0 ;
        if(ans < 0) ans += 10 , t = 1 ;
        c[len3] = ans ;
        ++ len3 ;       
    }
    while(c[len3] == 0 && len3 > 1) -- len3 ; //前導0
    for(int i = len3 ; i >= 1 ; -- i )
    cout << c[i];
    return 0;
}

乘法

#include<bits/stdc++.h>
#include<cstring>
using namespace std;

char s1[500] , s2[500] ;
int c[500] , ans , t , a[500] , b[500] ;

int main()
{

    memset(a , 0 , sizeof(a));
    memset(b , 0 , sizeof(b));
    memset(c , 0 , sizeof(c));
    gets(s1);
    gets(s2);
    int len1 = strlen(s1) , len2 = strlen(s2) ;
    for(int i = 1 ; i <= len1 ; ++ i ) 
        a[i] = s1[len1 - i] - '0' ;
    for(int i = 1 ; i <= len2 ; ++ i ) 
        b[i] = s2[len2 - i] - '0' ;
    for(int i = 1 ; i <= len1 ; ++ i ){
        t=0;
        for(int j = 1 ; j <= len2 ; ++ j ){
            c[i + j - 1] += a[i] * b[j] + t;
            t = c[i + j - 1] / 10;
            c[i + j - 1] %= 10;
        }
        c[ i+ len2] = t;        
    }
    int len3 = len1 + len2 ;
    while(c[len3] == 0 && len3 > 1) -- len3 ; 
    for(int i = len3 ; i >= 1 ; -- i)
    cout << c[i] ;
    return 0;
}

除法(帶余)

#include<bits/stdc++.h>
using namespace std;

char s1[300] , s2[300] , s3[300];
int c[300] , ans , t=0 , a[300] , b[300] , f[300] , d , e , p;

int main()
{
    memset(a , 0 , sizeof(a));
    memset(b , 0 , sizeof(b));
    memset(c , 0 , sizeof(c));
    gets(s1) ;
    gets(s2) ;  
    int len1 = strlen(s1) , len2 = strlen(s2) , len3 ;
    for(int i = 1 ; i <= len1 ; i++) a[i] = s1[len1 - i] - '0' ; 
    for(int i = 1 ; i <= len2 ; i++) b[i] = s2[len2 - i] - '0' ;
    d = len1 ;
    if(len2 > len1 || (len1 == len2) && (strcmp(s1,s2) < 0) )//如果除數比被除數小直接輸0;
        {
            cout << 0 ;
            return 0 ;
        }
    if(len1 == 1 && a[1] == 0)//如果被除數為0直接輸0;
        {
            cout << 0 ;
            return 0 ;
        }
    while(d != 0)
    {
        memset(f , 0 , sizeof(f)) ;
        while(a[d] == 0 && d > 0) -- d ;//d為當前被除部分的左端
        if(d < 1) break ;
        e = d - len2 + 1 ;
        p = 1 ;
        for(int j = 1 ; j <= len2 ; ++ j){//把當前被除的部分放到f數組里與除數比較大小
            f[j] = a[e+j-1] ;
            if(f[j] < b[j]) p = 0 ;
            else if(f[j] > b[j]) p = 1 ;//用p來討論大小
            }
        if(p == 0) -- e ;//e為當前被除部分的右端
        if(e <= 0) break ;//在商加1之前討論被除數有沒有除完
        for(int j = 1 ; j <= len2 ; ++ j){
            int k = e + j - 1 ;
            a[k] -= b[j] ;
            if(a[k] < 0) a[k] += 10 , -- a[k+1] ;
            }//只減一次 剩下的部分參與下一次循環
        ++ c[e] ;
    }
    ++ d ;
    while(c[len1] == 0 && len1 > 0) -- len1 ; 
    while(a[d] == 0 && d > 1) -- d ; 
    for(int i = len1 ; i >= 1 ; -- i)
        cout << c[i] ;
    //for(int i=d;i>=1;i--)
    // cout<<a[i];//這里還可以輸出余數
    return 0;

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM