由于c++没有像python、java等语言对一些超大整数的处理机制--(java中的大整数类啊,python中默认整数位数就可以无限大);所以,在对于一个c++学习者来说,对这类大整数的运算的掌握很有必要。同样,这也是对我们将人类模拟转化为代码语言的能力的一种提升。
c++
python
java
所以:在此,给各位看官总结了四类高精度运算的处理方式:
高精度加法(两个大整数相加,所谓大整数,指其位数最高可达10^5)
高精度减法(两个大整数相减)
高精度乘法(大整数与一个小整数相乘)
高精度除法(大整数除以一个小整数)
//高精度加法 #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; ? vector<int> add(vector<int> & a,vector<int> & b){ vector<int>sum; int t = 0;//用来保存进位 for(int i=0;i<a.size() || i<b.size();i++){ if(i < a.size()) t += a[i]; if(i < b.size()) t += b[i]; sum.push_back(t%10); t/=10; } if(t != 0) sum.push_back(t); return sum; } 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‘); auto C = add(A,B); for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]); return 0; } ?
//高精度减法 #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; ? string a,b; bool cmp(vector<int>&a,vector<int>&b){ //判断a表示的数是否大于b //1、比较位数 if(a.size()!=b.size()) return a.size()>b.size(); //2、位数相同则 从高位依次比位数大小 for(int i=a.size()-1;i>=0;i--){ if(a[i] != b[i]) return a[i] > b[i]; } //最后如果两个数相同,返回真.注意,不能返回假,否则输出结果时回输出“-0”而不是“0” 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] - t; if(i<b.size()) t -= b[i]; C.push_back((t+10) % 10); if(t<0) t=1; else t=0; } //现在C中存的是结果了,但我们还要去掉前导0,符合人们阅读习惯 while(C.size() > 1 && C.back()==0){ C.pop_back(); } return C; } int main(){ cin>>a>>b; vector<int>A,B; for(int i=a.size()-1;i>=0;