大整数四则运算

以结构体表示大整数,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");
	

出自算法笔记——数学问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值