高精度加法
791. 高精度加法 - AcWing题库
给定两个正整数(不含前导 00),计算它们的和。
输入格式
共两行,每行包含一个整数。
输出格式
共一行,包含所求的和。
数据范围
1≤整数长度≤1000001≤整数长度≤100000
输入样例:
输出样例:
思路:模拟加法的过程,从末尾开始,逐步进位相加取模
ps:需要注意if(i>=a.size()) t1=0; if(i>=b.size()) t2=0;这两步,因为’’-‘0’不为0
代码如下:
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;
string a,b,x; int t1, t2;
int main() { cin>>a>>b; reverse(a.begin(), a.end()), reverse(b.begin(), b.end()); int t=0; for(int i=0;i<a.size() || i<b.size(); i++) { t1=a[i]-'0', t2=b[i]-'0'; if(i>=a.size()) t1=0; if(i>=b.size()) t2=0; int mo=(t1+t2+t)%10; x+=to_string(mo); t=(t1+t2+t)/10; } if(t==1) x+="1"; reverse(x.begin(),x.end()); cout<<x<<endl; return 0; }
|
高精度减法
792. 高精度减法 - AcWing题库
给定两个正整数(不含前导 00),计算它们的差,计算结果可能为负数。
输入格式
共两行,每行包含一个整数。
输出格式
共一行,包含所求的差。
数据范围
1≤整数长度≤1051≤整数长度≤105
输入样例:
输出样例:
思路:先实现cmp()比数的大小,小减大要添“-”,在末尾模拟减法操作
代码如下:
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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| #include <bits/stdc++.h> using namespace std;
string a,b; vector<int> ans;
bool cmp(string a,string b) { if(a.size()!=b.size()) return a.size()>b.size(); for(int i=0;i<a.size();i++) { if(a[i]!=b[i]) { return a[i]>b[i]; } } return true; }
void solve(string a,string b) { reverse(a.begin(),a.end()); reverse(b.begin(),b.end()); int t=0,t1,t2; for(int i=0;i<a.size();i++) { if(i<b.size()) t2=b[i]-'0'; else t2=0; t1=a[i]-'0'-t; if(t1<t2) { t=1; ans.push_back(t1+10-t2); } else { t=0; ans.push_back(t1-t2); } } while(ans.size()>1 && ans.back()==0) ans.pop_back(); }
int main() { cin>>a>>b; if(a==b) puts("0"); else if(cmp(a,b)) solve(a,b); else { cout<<"-"; solve(b,a); } for(int i=ans.size()-1;i>=0;i--) cout<<ans[i]; return 0; }
|
高精度乘法
793. 高精度乘法 - AcWing题库
给定两个非负整数(不含前导 00) AA 和 BB,请你计算 A×BA×B 的值。
输入格式
共两行,第一行包含整数 AA,第二行包含整数 BB。
输出格式
共一行,包含 A×BA×B 的值。
数据范围
1≤A的长度≤1000001≤A的长度≤100000,
0≤B≤100000≤B≤10000
输入样例:
输出样例:
操作:记住 *if(i<A.size()) t+=A[i]b;
ps:注意条件判断是 (i<A.size() || t)
代码如下:
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
| #include <bits/stdc++.h> using namespace std;
string a; int b; vector<int> A, ans;
void solve() { int t=0; for(int i=0;i<A.size() || t;i++) { if(i<A.size()) t+=A[i]*b; ans.push_back(t%10); t/=10; } while(ans.size()>1 && ans.back()==0) ans.pop_back(); }
int main() { cin>>a>>b; for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0'); solve(); for(int i=ans.size()-1;i>=0;i--) cout<<ans[i]; return 0; }
|
高精度除法
794. 高精度除法 - AcWing题库
给定两个非负整数(不含前导 00) A,BA,B,请你计算 A/BA/B 的商和余数。
输入格式
共两行,第一行包含整数 AA,第二行包含整数 BB。
输出格式
共两行,第一行输出所求的商,第二行输出所求余数。
数据范围
1≤A的长度≤1000001≤A的长度≤100000,
1≤B≤100001≤B≤10000,
BB 一定不为 00
输入样例:
输出样例:
思路:核心记住 t=t*10+A[i];
代码如下:
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
| #include <bits/stdc++.h> using namespace std;
string a; int b,t; vector<int> A,C;
void solve() { for(int i=0;i<A.size();i++) { t=t*10+A[i]; C.push_back(t/b); t%=b; } reverse(C.begin(),C.end()); while(C.size()>1 && C.back()==0) C.pop_back(); }
int main() { cin>>a>>b; for(int i=0;i<a.size();i++) A.push_back(a[i]-'0'); solve(); for(int i=C.size()-1;i>=0;i--) cout<<C[i]; cout<<endl<<t<<endl; return 0; }
|