大数模板

大数加减乘除模板

利用vector的做法;

	#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
//一个大整数一个整数的除法,和余数;
vector<int> div(vector<int> &A, int b, int &r){
vector<int> c;
//int tmp = 0;
r = 0;
for(int i = 0; i < A.size(); i++){
r = r * 10 + A[i];
c.push_back(r / b);
r = r % b;
}
reverse(c.begin(),c.end());
while(c.size() > 1 && c.back() == 0) c.pop_back();
return c;
}
//一个大整数,一个整数的乘法
vector<int> muti(vector<int>A, int b){
vector<int> c;
int tmp = 0;
for(int i = 0; i < A.size(); i++){
tmp += A[i] * b;
c.push_back(tmp % 10);
tmp /= 10;
}
while(tmp){
c.push_back(tmp % 10);
tmp /= 10;
}
return c;
}
//两个大整数
vector<int> muti1(vector<int> &A, vector<int> &B){
vector<int> c(A.size() + B.size());
for(int i = 0; i < A.size(); i++){
for(int j = 0; j < B.size(); j++){
c[i + j + 1] += A[i] * B[j];
}
}
for(int i = A.size() + B.size() - 1; i > 0; i--){
if(c[i] >= 10){
c[i - 1] += c[i] / 10;
c[i] %= 10;
}
}
return c;
//注意有可能有前导0;
}

//大数减法;
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){
if(cmp(A,B)){
vector<int>c;
int tmp = 0;
for(int i = 0; i < A.size(); i++){
tmp += A[i];
if(i < B.size()) tmp -= B[i];
c.push_back((tmp + 10)%10);
//tmp /= 10;
if(tmp < 0)tmp = -1;
else tmp = 0;
}
while(c.size() > 1 && c.back() == 0) c.pop_back();
return c;
}
else {
cout<<"-";
return sub(B,A);
}
}
//大数加法
vector<int> add(vector<int> &A, vector<int> &B){
if(A.size() < B.size()) return add(B,A);
int tmp = 0;
vector<int>c;
for(int i = 0; i < A.size(); i++){
tmp += A[i];
if(i < B.size())tmp += B[i];
c.push_back(tmp%10);
if(tmp >= 10) tmp = 1;
else tmp = 0;
}
if(tmp)c.push_back(tmp);
return c;
}
int main()
{
string a,b;
//int b,r = 0;
cin>>a>>b;
vector<int>A,B,C;
for(int i = a.length() - 1; i >= 0; i--)A.push_back(a[i] - '0');
for(int i = b.length() - 1; i >= 0; i--)B.push_back(b[i] - '0');
//C = div(A,b,r);
C = add(A,B);
for(int i = C.size() - 1; i >= 0; i--)cout<<C[i];
cout<<endl;
//cout<<endl;
return 0;
}
Author: cheerfulman
Link: http://cheerfulman.github.io/2019/09/16/biginterger/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Donate
  • 微信
  • 支付寶

Comment