高精度模板 val.1
同样搬运以前初三在CSDN写的。。。
高精度算法
高精构造
- 这里使用结构体封装,方便使用
- 尽量避免直接赋等,会加上个On复杂度
结构体
struct bigint{
int length,num[maxn];
bigint(){
memset(num,0,sizeof(num));
length=1;
}
bigint(int n){
memset(num,0,sizeof num);
length = 0;
if(!n) length = 1;
else{
while(n){
num[++length] = n%10;n/=10; // 取出n的每一位,下标反过来存
}
}
}
};
char数组转高精:
inline void change(char a[],bigint &b){
b.length=strlen(a);
for(int i=1;i<=b.length;i++){
b.num[i]=a[b.length-i]-'0';//注意要减去‘0’
}
}
高精加高精
inline void add(bigint &a,bigint &b){
int ll=max(a.length,b.length); // a+b的位数是a和b位数的最大值
int exd=0; // 模拟进位
for(int i=1;i<=ll;i++){
int tmp=a.num[i]+b.num[i]+exd;
a.num[i]=tmp%10;
exd=tmp/10;
}
a.length=ll;
if(exd) a.num[++a.length]= exd; // 最后进1?
}
变量维护进位,模拟即可
高精乘单精
inline void mul(bigint &a,int b){
for(int i=1;i<=a.length;i++){
a.num[i]*=b;
}
for(int i=1;i<=a.length;i++){
a.num[i+1]+=a.num[i]/10;
a.num[i]%=10;
}//此时ai可能不止一位
int m=a.num[a.length+1];
while(m){
a.num[++a.length]=m%10;
m/=10;
}//最高位长度处理
}
高精除单精
inline void div(bigint &a,int b){
int d=0;
for(int i=a.length;i>=1;i--){
int tmp=d*10+a.num[i];
a.num[i]=tmp/b;
d=tmp%b;
}
while(a.num[a.length]==0){
a.length--;
} //去除高位0
}
高精和高精乘除与压位高精就之后再写吧 (
(咕