高精度加法,減法

高精度運算:
是指參與運算的數(加數,減數,因子……)範圍大大超出了標準數據類型(整型,實型)能表示的範圍的運算。

對於一個高精度正整數,接受與存儲的程序段如下:

輸入處理

int na[110]={0},nb[110]={0};//用數組按位存放高精度正整數,初值全爲0
int la=a.size(),lb=b.size();//高精度正整數的位數
  /***數組從右向左存儲,na[0]存放個位,na[1]存放十位...***/
    for(int i=0;i<la;i++){
       na[la-1-i]=a[i]-'0';
    }
    for(int i=0;i<lb;i++){
        nb[lb-1-i]=b[i]-'0';
    }

相加

 int lmax=la>lb?la:lb;//選取最長長度開始相加
 for(int i=0;i<lmax;i++){
    na[i]+=nb[i];  //兩數相加
    na[i+1]+=na[i]/10;//要進的位
    na[i]%=10;//進位後的數
    }
    //如果最高位大於10,即na[lmax-1+1]=1;lmax++
    if(na[lmax]){
     lmax++;//位數加1
    }

處理最高進位

例如:當輸入爲00006 00003時

    for(int i=lmax-1;i>=0;i--){
        if(na[lmax-1]==0)
            lmax--;
    }

輸出結果

 for(int i=lmax-1;i>=0;i--){
        ans+=na[i]+'0';//從高位到低位依次給字符串ans
    }

完整代碼


#include<bits/stdc++.h>
using namespace std;
const int L=110;
//兩個非負整數相加
//方法 倒置相加再還原
string add(string a,string b){
    string ans;
    int na[L]={0},nb[L]={0};
    int la=a.size(),lb=b.size();
    //倒置
    for(int i=0;i<la;i++){
       na[la-1-i]=a[i]-'0';
    }
    for(int i=0;i<lb;i++){
        nb[lb-1-i]=b[i]-'0';
    }
    //選取最長長度開始相加
    int lmax=la>lb?la:lb;
    for(int i=0;i<lmax;i++){
    na[i]+=nb[i];
    na[i+1]+=na[i]/10;
    na[i]%=10;

    }
    //如果最高位大於10,即na[lmax-1+1]=1;lmax++
    if(na[lmax]){
     lmax++;
    }
    /***第一次沒有處理高位爲0d的情況***/
    for(int i=lmax-1;i>=0;i--){
        if(na[lmax-1]==0)
            lmax--;
    }
    //還原
    for(int i=lmax-1;i>=0;i--){
        ans+=na[i]+'0';
    }
    return ans;
}


int main(){
//高精度加法
//用tring 類型傳入參數  算法複雜度  O(n)
  string a,b;
 while(cin>>a>>b){
        cout<<add(a,b)<<endl;
  }
return 0;
}

減法運算同理

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
const int L=110;
string sub(string a,string b){
string ans;
int na[L]={0},nb[L]={0};
int la=a.size(),lb=b.size();
int lmax=la>lb?la:lb;
for(int i=0;i<la;i++){
    na[la-1-i]=a[i]-'0';
}
for(int i=0;i<lb;i++){
    nb[lb-1-i]=b[i]-'0';
}
for(int i=0;i<lmax;i++){
    na[i]=na[i]-nb[i];
    if(na[i]<0){
        na[i]=na[i]+10;
        na[i+1]--;
    }
}
for(int i=lmax-1;i>=0;i--){
    if(na[lmax-1]==0){
        lmax--;
    }
}
for(int i=lmax-1;i>=0;i--){
    ans+=na[i]+'0';
}
return ans;
}
int main(){
int T;
string a,b;
scanf("%d",&T);
while(T--){
    cin>>a>>b;
    cout<<sub(a,b)<<endl;
}
return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章