C++中的大数运算
大数是指数据量比较大的数,其数据长度可达106
#include <iostream>
#include <vector>
#include <algorithm>
//高精度问题存在C++中 python和Java中不涉及
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;
}
vector<int> add(vector<int> &A, vector<int> &B);
vector<int> sub(vector<int> &A, vector<int> &B);
vector<int> mul(vector<int> &A, int b);//此时的 b 是一个小范围的数
vector<int> div(vector<int> &A, int b, int &r);// A/b = C …… r
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');
}
printf("\nA + B = ");
C = add(A,B);
for(int i = C.size()-1; i >= 0; i--) {
printf("%d",C[i]);
}
// 判断 A与B大小 A>=B C=A-B;or C=-B-A
printf("\nA - B = ");
if( cmp(A,B)) {
C = sub(A,B);
for(int i = C.size()-1; i >= 0; i--)
printf("%d",C[i]);
}
else{
printf("-");
C = sub(B,A);
for(int i = C.size()-1; i >= 0; i--)
printf("%d",C[i]);
}
int ib; cin >> ib;
printf("\nA * b = ");
C = mul(A, ib);
for(int i = C.size()-1; i >= 0; i--)
printf("%d",C[i]);
printf("\nA / b = ");
int r; //用来存储余数
C = div(A, ib, r);
for(int i = C.size()-1; i >= 0; i--)
printf("%d",C[i]);
cout << "……" << r << endl;
return 0;
}
vector<int> add(vector<int> &A, vector<int> &B){
int t = 0; // 用t表示从低位到高位的进位
vector<int> C;
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];
C.push_back( t%10 );
t = t/10;
}
//最高位的进位
if( t) C.push_back( 1);
return C;
}
vector<int> sub(vector<int> &A, vector<int> &B ){
int t = 0; // 表示借位
vector<int> C;
for(int i = 0; i < A.size(); i++){
t = A[i] -t; //先减去低位的借位
if(i < B.size() ) t -= B[i]; //保证对应位置有减数
C.push_back( (t+10) % 10); // t > 0 则不变 否则 t += 10
if( t < 0) t = 1;
else t = 0;
}
//除去前导0
while( C.size() > 0 && C.back() == 0 ) C.pop_back();
return C;
}
vector<int> mul(vector<int> &A, int b){
vector<int> C;
int t; //表示进位
for(int i = 0; i<A.size() || t ; i++) {
if( i <A.size()) t += A[i] * b;
C.push_back(t % 10); //取个位
t /= 10; //取进位
}
return C;
}
//如果只涉及除法时 数字从高到低存储更方便
vector<int> div(vector<int> &A, int b, int &r){
r = 0; // 用t表示从低位到高位的进位
vector<int> C;
for(int i = A.size()-1; i >= 0; i--){
r = r*10 + A[i];
C.push_back( r / 10);
r %= b;
}
reverse(C.begin(),C.end());
//除去前导0
while( C.size() > 0 && C.back() == 0 ) C.pop_back();
return C;
}