以结构体表示大整数,Int数组存放,且优点在于其高位表示整数的高位,最较高位可直接改动,不用变动其他位
//大整数四则运算
#include<cstdio>
#include<cstring>
struct big{
big(){//结构体函数,方便结构体变量声明时就可以初始化
memset(d,0,sizeof(d));
len=0;
}
int len;
int d[1001];//大整数以结构体表示,数组高位表示大整数的对应高位
};
big change(char s[]){//将字符串数组转化为int数组
big a;
a.len=strlen(s);
for(int i=0;i<a.len;i++) { //1234->4321
a.d[i]=s[a.len-i-1]-'0';//逆向赋值
}
return a;
}
int compare(big a,big b){//比较大小 -1,0,1(a>b三种可能
if(a.len!=b.len) return a.len>b.len;
else{
for(int i=a.len-1;i>=0;i--){
if(a.d[i]>b.d[i]) return 1;
else if(a.d[i]<b.d[i]) return -1;
}
}
return 0;//所有位都相等
}
对于加法,这里默认是非负整数,正+正
当 正 + 负 =正-(-负)
当 负+负=-(正+正)
对于减法,默认a>b&&a,b>=0
当 a,b>=0 a<b是 符号为负,swap(a,b)
即判断abs(a)与abs(b)大小
big add(big a,big b){//加法 ,从低位开始加
big c;//声明并初始化、
int carry=0,i;//进位
for( i=0;i<a.len||i<b.len;i++){
int t=a.d[i]+b.d[i]+carry;
carry=t/10;
c.d[c.len++]=t%10;
}
if(carry!=0){
c.d[c.len]=carry;
c.len++;
}
return c;
} //前提a,b为非负整数
big sub(big a,big b){ //减法 ,a-b从低位开始减
big c;//声明并初始化c.len=0;
int t,i;
for(i=0;i<a.len||i<b.len;i++){
if(a.d[i]<b.d[i]){
a.d[i+1]-=1;
a.d[i]+=10;
}
c.d[c.len++]=a.d[i]-b.d[i];
}
while(c.d[c.len-1]==0&&c.len>0){//当a-b=0时,c.len=0
c.len--;
}
return c;
}//前提是:a>b 当a<b时 结构为负且交换a,b再调用sub
void print(big a){
for(int i=a.len-1;i>=0;i--){
printf("%d",a.d[i]);
}
}
默认a,b>=0
big divide( big a,int b,int& r){//r余数初始值为 0,r<b,商在 big c中
big c;
c.len=a.len;
int i;
for (i=a.len-1;i>=0;i--){
r=r*10+a.d[i];
if(r<b){//不够除 !!这儿出错了,写成了a.d[i]<b
c.d[i]=0;
}else { //够除
c.d[i]=r/b;
r=r % b;
}
}
while(c.len>2&&c.d[c.len-1]==0){//位数至少两位才会有多余的高位0
c.len--;
}
return c;
}
void print(big a){
for(int i=a.len-1;i>=0;i--){
printf("%d",a.d[i]);
}
}
大整数a(int) b*
big multi(big a,int b){
big c;
int carry=0,t;
for(int i=0;i<a.len;i++){
t=carry+b*a.d[i];
c.d[c.len++]=t%10;
carry=t/10;
}
while(carry!=0){
c.d[c.len++]=carry%10;
carry/=10;
}
return c;
}
void print(big a){
for(int i=a.len-1;i>=0;i--){
printf("%d",a.d[i]);
}
}
void print(big a){
for(int i=a.len-1;i>=0;i--){
printf("%d",a.d[i]);
}
printf("\n");
出自算法笔记——数学问题