高精度運算:
是指參與運算的數(加數,減數,因子……)範圍大大超出了標準數據類型(整型,實型)能表示的範圍的運算。
對於一個高精度正整數,接受與存儲的程序段如下:
輸入處理
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;
}