acwing算法-高精度四则运算

    科技2026-03-20  7

    目录

    (一)高精度四则运算(1)题目-加法(1.2)代码(2)题目-减法(2.2)代码(3)题目-乘法(3.2)代码(4)题目-除法(4.2)代码 (二)总结

    (一)高精度四则运算

    (1)题目-加法

    给定两个正整数,计算它们的和。

    输入格式 共两行,每行包含一个整数。

    输出格式 共一行,包含所求的和。

    数据范围 1≤整数长度≤100000

    输入样例:

    12 23

    输出样例:

    35

    (1.2)代码

    #include<iostream> using namespace std; #include<vector> vector<int> add(vector<int> &A,vector<int>&B){ int t=0; vector<int> C; for(int i=0;i<A.size()||i<B.size()||t;i++){ if(i<A.size())t+=A[i]; if(i<B.size())t+=B[i]; C.push_back(t%10); t/=10; } //if(t) C.push_back(t);改为for循环内部 return C; } int main(){ string a,b; cin>>a>>b; vector<int>A,B; for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0'); for(int i=b.size()-1;i>=0;i--)B.push_back(b[i]-'0'); vector<int> C=add(A,B); for(int i=C.size()-1;i>=0;i--)cout<<C[i]; return 0; }

    (2)题目-减法

    给定两个正整数,计算它们的差,计算结果可能为负数。

    输入格式 共两行,每行包含一个整数。

    输出格式 共一行,包含所求的差。

    数据范围 1≤整数长度≤105

    输入样例:

    32 11

    输出样例:

    21

    (2.2)代码

    #include<iostream> using namespace std; #include<vector> bool cmp(vector<int> &A,vector<int> &B){ if(A.size()!=B.size())return A.size()>B.size(); for(int i=A.size()-1;i>=0;i--){ if(A[i]!=B[i])return A[i]>B[i]; } return true; } vector<int> sub(vector<int> &A,vector<int>&B) { vector<int> C; for(int i=0,t=0;i<A.size();i++){ t+=A[i]; if(i<B.size())t-=B[i]; C.push_back((t+10)%10); if(t<0)t=-1; else t=0; } while(C.size()>1&&C.back()==0)C.pop_back(); return C; } int main(){ string a,b; cin>>a>>b; vector<int> A,B,C; for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0'); for(int i=b.size()-1;i>=0;i--)B.push_back(b[i]-'0'); if(cmp(A,B)){ C=sub(A,B); } else{ C=sub(B,A); cout<<"-"; } for(int i=C.size()-1;i>=0;i--)cout<<C[i]; return 0; }

    (3)题目-乘法

    给定两个正整数A和B,请你计算A * B的值。

    输入格式 共两行,第一行包含整数A,第二行包含整数B。

    输出格式 共一行,包含A * B的值。

    数据范围 1≤A的长度≤100000 , 0≤B≤10000

    输入样例:

    2 3

    输出样例:

    6

    (3.2)代码

    #include<iostream> using namespace std; #include<vector> vector<int> mul(vector<int> &A, int b) { vector<int> C; int t = 0; for (int i = 0; i < A.size() || t; i ++ ) { if (i < A.size()) t += A[i] * b; C.push_back(t % 10); t /= 10; } while(C.size()>1&&C.back()==0)C.pop_back(); return C; } int main(){ string a; int b; cin>>a>>b; vector<int>A; for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0'); vector<int> C=mul(A,b); for(int i=C.size()-1;i>=0;i--)cout<<C[i]; return 0; }

    (4)题目-除法

    给定两个非负整数A,B,请你计算 A / B的商和余数。

    输入格式 共两行,第一行包含整数A,第二行包含整数B。

    输出格式 共两行,第一行输出所求的商,第二行输出所求余数。

    数据范围 1≤A的长度≤100000 , 1≤B≤10000 B 一定不为0

    输入样例:

    7 2

    输出样例:

    3 1

    (4.2)代码

    #include<iostream> using namespace std; #include<algorithm> #include<vector> vector<int> div(vector<int> &A,int b,int &r){ vector<int > C; for(int i=A.size()-1;i>=0;i--){ r=r*10+A[i]; C.push_back(r/b); r%=b; } reverse(C.begin(),C.end()); while(C.size()>1&&C.back()==0)C.pop_back(); return C; } int main(){ string a; int b,r=0; cin>>a>>b; vector<int> A,C; for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0'); C=div(A,b,r); for(int i=C.size()-1;i>=0;i--)cout<<C[i]; cout<<endl<<r; return 0; }

    (二)总结

    1.j加法中注意最后要判断t; 2.减法,乘法,除法要去除首位0,减法要注意A与B的大小; 3.堆区初始化变量会有初始值0或者false,而在栈区则随机; 4.reverse()函数在algorithm里面。

    若有不正确之处,望大家指正,共同学习!谢谢!!!

    本文参考网址

    Processed: 0.014, SQL: 9