当然在java中,进行高精度的加法、减法、乘法、除法运算的时候,可以通过java.math包中提供的BigInteger类提供的的方法来进行计算:
给定两个正整数,计算它们的和。
vector是stl里的动态数组,动态数组是模板库中的一个类,当元素的个数大于等于数组的大小的时候,数组的大小会变成原来的两倍,系统会从另一片区域中找出一块原来的数组的内存的两倍的空间,之后再把原来的数组拷贝到新的数组中。
为什么用a[i]-‘0’?因为ASCII中的0-9对应48-57,但我们计算的时候想要数字,而不是它的ASCII码。所以必须让0变为0,1变为1以此类推…
’0‘ - ’0‘ = 0 –> 48 - 48 = 0
‘1’ - ‘0’ = 1 –> 49 - 48 = 1
- #include
- #include
-
- using namespace std;
-
- const int N=1e6+10;
-
- vector<int> add(vector<int> &A,vector<int> &B)
- {
- vector<int> C;
-
- int t=0;//设置进位,初始为0
- for(int i=0;i
size() or isize();i++) - {
- if(i
size()) t+=A[i]; - if(i
size()) t+=B[i]; - //以上两步进行完后,t=上一轮加法的进位已经这一轮ab的和
- C.push_back(t%10);
- t/=10;
- }
-
- if(t) C.push_back(1); //最终t仍为1发生进位
- return C;
- }
-
- int main()
- {
- string a,b;//a,b太大所以用字符串形式写入
- vector<int> A,B;
-
- cin>>a>>b;
- for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0'); //将a[i]转换为int型,并从个位开始读入方便进位
- for(int i=b.size()-1;i>=0;i--) B.push_back(b[i]-'0'); //将b[i]转换为int型
-
- auto C=add(A,B); //auto编译器自动判断类型
-
- for(int i=C.size()-1;i>=0;i--) cout<
-
-
- }
-
三、高精度减法
- #include
- #include
-
- using namespace std;
-
- //判断A是否大于等于B
- 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;
- }
- //C=A-B
- vector<int> sub(vector<int> &A,vector<int> &B)
- {
- vector<int> C;
- for(int i=0,t=0; i
size(); i++) - {
- t =A[i]-t;
- if(i
size()) t-=B[i]; - C.push_back((t+10)%10);
- if(t<0) t=1;
- else t=0;
- }
-
- while(C.size()>1 and C.back()==0) C.pop_back();//去除前导0 (002 001)
- return C;
- }
-
-
- int main()
- {
- string a,b;
- vector<int> A,B;
- cin>>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;
- if(cmp(A,B))
- {
- //判断A是否大于B
- auto C=sub(A,B);
- for(int i=C.size()-1;i>=0;i--) cout<
- }
- else{
- auto C=sub(B,A);
- cout<<"-";
- for(int i=C.size()-1;i>=0;i--) cout<
- }
- }
-
-
四、高精度乘法
- #include
- #include
-
- using namespace std;
-
- vector<int> mul(vector<int> &A,int b){
- vector<int> C;
-
- int t=0;
- for(int i=0;i
size() or t;i++) - {
- if(i
size()) t+=A[i]*b; - C.push_back(t%10);
- t/=10;
- }
-
- while(C.size()>1 and C.back()==0) C.pop_back();//去除前置0
- 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');
-
- auto C=mul(A,b);
-
- for(int i=C.size()-1;i>=0;i--) cout<
- return 0;
- }
-
五、高精度除法
- #include
- #include
- #include
-
- using namespace std;
-
- //A/b,商是c余数是r
- vector<int> div(vector<int> &A,int b,int &r)
- {
- vector<int> C;
- r=0;
- 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 and 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');
-
- int r;
- auto C=div(A,b,r);
-
- for(int i=C.size()-1;i>=0;i--) cout<
- cout<
- cout<
-
- return 0;
-
- }
-
-
-
相关阅读:
kafka无法启动的问题
ContentServiceImpl
flask-sqlalchemy 绑定多个数据库并实现多数据库迁移
Android入门第31天-Android里的ViewFlipper翻转视图的使用
系统架构师考试科目一:综合知识
EasyExcel导入导出
【华为OD机试真题 JS】贪吃蛇
Node学习笔记之Node简介
面试整理(不断更新)
NotePad++安装一些插件的使用
-
原文地址:https://blog.csdn.net/m0_67463447/article/details/127825718