#include<bits/stdc++.h>
const int maxn = 1e2;
using namespace std;
class BigInt{
public:
int len;
int a[maxn];//个位在最前面,数字下标从1开始,a[0]表示符号
public:
BigInt(int l=1,int a1=0);
friend ostream& operator<<(ostream& out,BigInt& A);
friend istream& operator>>(istream& in,BigInt& A);
friend BigInt operator+(const BigInt& A,const BigInt& B);
friend BigInt operator*(const BigInt& A,const BigInt& B);
friend BigInt operator/(const BigInt& A,const BigInt& B);//未实装
friend BigInt operator-(const BigInt& A,const BigInt& B);//未实装
friend BigInt chu2(BigInt A);
friend bool operator==(const BigInt& A,const BigInt& B);
friend BigInt Qpow(BigInt e,int b);
};
BigInt::BigInt(int l,int a1){
len = l;
memset(a,0,sizeof(a));
a[1] = a1;
}
BigInt operator*(const BigInt& A,const BigInt& B){
BigInt C;
C.len=A.len+B.len;
/*总结一个规律:即一个数的第i 位和另一个数的第j 位相乘所得的数,
一定是要累加到结果的第i+j 位上。这里i, j 都是从右往左,从0 开始数。
即:ans[i+j] = a[i]*b[j];*/
for(int i=1;i<=A.len;i++){//将因数各个位上的数字与另一个各个位上的数字相乘
for(int j=1;j<=B.len;j++)
C.a[i+j-1]+=A.a[i]*B.a[j];//先乘起来,后面统一进行进位
}
for(int i=1;i<=C.len;i++){//进行进位
if(C.a[i]>=10){ //若>=10
C.a[i+1]+=C.a[i]/10; //将十位上数字进位
C.a[i]=C.a[i]%10; //将个位上的数字留下
}
}
for(int i=C.len;i>=1;i--)//把前导零去掉
if(C.a[i]){
C.len = i;
break;
}
return C;
}
BigInt operator+(const BigInt& A,const BigInt& B){
BigInt C(1,0);
C.len = max(A.len,B.len);
for(int i=1;i<=C.len;i++){
C.a[i]=A.a[i]+B.a[i]+C.a[i];//c.a[i]表示之前的进位
if(C.a[i]>=10){
C.a[i+1]=1;
C.a[i]-=10;
}
}
if(C.a[C.len+1]>0)C.len++;
return C;
}
bool operator==(const BigInt& A,const BigInt& B){
if(A.len!=B.len)return false;
else{
for(int i=1;i<=A.len;i++)
if(A.a[i]!=B.a[i])return false;
return true;
}
}
BigInt Qpow(BigInt e,int b){
BigInt res(1,1);
while(b > 0){
if(b&1) res = res*e;
e = e*e;
b >>= 1;
}
return res;
}
BigInt chu2(BigInt A){
BigInt ans(A.len,0);
for(int i=A.len;i>=1;i--){
if(A.a[i]<2)
A.a[i+1] += A.a[i]*10;//
else if(A.a[i]>=2){
ans.a[i] = A.a[i]/2;
ans.a[i-1] += A.a[i]%2;
}
}
for(int i=A.len;i>=1;i--)
if(A.a[i]){
A.len = i;
break;
}
return ans;
}
BigInt Qpow(BigInt e,BigInt b){
BigInt res(1,1);
while(b.len>1||(b.len==1&&b.a[1]> 0)){
if(b.a[1]&1) res = res*e;
e = e*e;
b = chu2(b);
}
return res;
}
ostream& operator<<(ostream& out,BigInt& A){
for(int i=A.len;i>=1;i--)
out<<A.a[i];
}
istream& operator>>(istream& in,BigInt& A){
string str;
in>>str;
int len = str.length();
A.len = len;
for(int j=1;j<=len;j++){
A.a[j]=str[len-j]-'0';
}
}
高精度加法、乘法、快速幂(大数类)
最新推荐文章于 2024-02-25 19:36:35 发布