高精度:是指超出long long int的范围的数据,一般用数组存储。
单精度一般是指long long int范围内的数,即可以用基本数据类型表示的数。
1.高精度加法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| #include<bits/stdc++.h> using namespace std; const int N = 505; string add(string A,string B) { int la=A.length(),lb=B.length(); int a[N]={0},b[N]={0}; for(int i=0;i<la;i++)a[la-i-1]=A[i]-'0'; for(int j=0;j<lb;j++)b[lb-j-1]=B[j]-'0'; int lm=la>lb?la:lb; for(int i=0;i<lm;i++){ a[i]+=b[i],a[i+1]+=a[i]/10,a[i]%=10; } if(a[lm])lm++; string ans; for(int i=lm-1;i>=0;i--)ans+=a[i]+'0'; return ans; } int main() { string a,b; cin>>a>>b; cout<<add(a,b)<<endl; return 0; }
|
2.高精度减法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| #include<bits/stdc++.h> using namespace std; const int N = 10100;
bool cmp(string A,string B) { if(A.size()>B.size() || A>=B && A.size()==B.size())return true; return false; } string sub(string A,string B) { string ans; int a[N]={0},b[N]={0}; int la=A.size(),lb=B.size(); for(int i=0;i<la;i++)a[la-1-i]=A[i]-'0'; for(int i=0;i<lb;i++)b[lb-1-i]=B[i]-'0'; int lm=la>lb?la:lb; for(int i=0;i<lm;i++){ a[i]-=b[i]; if(a[i]<0)a[i]+=10,a[i+1]-=1; } while(a[lm]==0 && lm>0)lm--; for(int i=lm;i>=0;i--) ans+=a[i]+'0'; return ans; } int main() { string a,b; cin>>a>>b; int flag=0; if(!cmp(a,b))flag = 1,swap(a,b); if(flag)cout<<"-"; cout<<sub(a,b)<<endl; return 0; }
|
3.高精度乘单精度
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| #include<iostream> #include<string> using namespace std; const int N = 250; string mul(string A,int b) { string ans; int a[N]={0}; int la=A.size(); for(int i=0;i<la;i++)a[la-1-i]=A[i]-'0'; int w=0; for(int i=0;i<la;i++){ a[i]=a[i]*b+w,w=a[i]/10,a[i]%=10; } while(w>0)a[la++] = w%10,w /= 10; for(int i=la-1;i>=0;i--)ans+= a[i]+'0'; return ans; } int main() { string a; int b; cin>>a>>b; cout<<mul(a,b)<<endl; return 0; }
|
4.高精度乘高精度
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| #include<bits/stdc++.h> using namespace std; const int N = 300; string mul(string A,string B) { string ans; int a[N]={0},b[N]={0},c[N]={0}; int la=A.size(),lb=B.size(); for(int i=0;i<la;i++)a[la-i-1]=A[i]-'0'; for(int i=0;i<lb;i++)b[lb-i-1]=B[i]-'0'; for(int i=0;i<la;i++) for(int j=0;j<lb;j++) c[i+j] +=a [i]*b[j]; for(int i=0;i<la+lb;i++)if(c[i]>9)c[i+1] += c[i]/10, c[i] %=10; if(c[la+lb-1])ans += c[la+lb-1]+'0'; for(int i=la+lb-2;i>=0;i--)ans+=c[i]+'0'; return ans; } int main() { string a,b; cin>>a>>b; cout<<mul(a,b)<<endl; return 0; }
|
高精度乘高精度的朴素算法时间复杂度O(n2),可通过快速傅里叶优化
5.高精度除单精度
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #include<bits/stdc++.h> using namespace std; const int N = 300; string div(string a,int b) { int left=0; string ans; for(int i=0;i<a.size();i++){ ans += (a[i]-'0'+left*10)/b +'0'; left = (a[i]-'0'+left*10)%b; } int i=0; while(i<ans.size()-1 && ans[i]=='0') i++; return ans.substr(i); }
int main() { string a; int b; cin>>a>>b; cout<<div(a,b)<<endl; return 0; }
|
6.高精度模单精度
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #include<bits/stdc++.h> using namespace std; const int N = 300;
int mod(string a,int b) { int left=0; for(int i=0;i<a.size();i++){ left = (a[i]-'0'+left*10)%b; } return left; } int main() { string a; int b; cin>>a>>b; cout<<mod(a,b); return 0; }
|
参考:https://blog.csdn.net/u013615904/article/details/43373601