简单的大数模板

简单的大数模板,包含加减乘除,注意,下面的函数都没有考虑首位为’-'的情况,所以要根据题目来修改
这里解释一下为什么存入结构的时候要逆着存储
因为用字符串读入数字的时候,数字的高位对应着字符串的低位,而数字的低位对应着字符串的高位,所以要倒着给结构体赋值,使其高低位相同。

#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;
struct bign
{
	int d[1000];
	int len;	
	bign()
	{
		memset(d,0,sizeof(d));
		len=0;
	}
};
//字符数组转换到结构体中 
bign change(char str[])
{
	bign a;
	a.len=strlen(str);
	for(int i=0;i<a.len;i++)
	{
		a.d[i]=str[a.len-i-1]-'0';//逆着赋值 
	}
	return a;
}
//比较大小 
int compare(bign a,bign b)
{
	//先判断长度,较长者较大
	//长度相等则遍历 出现不相等时 较大数更大 (从高位往低位比)
	if(a.len>b.len) return 1;//a大 
	else if(a.len<b.len) return -1;
	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;
	}
}

//对于两个对象都是同符号的情况 都小于零则需要输出负号 
bign add(bign a,bign b)
{
	bign c;
	int carry=0; //进位
	//以较长的为界限 
	for(int i=0;i<a.len||i<b.len;i++)
	{
		//两个对应位与进位相加 ,当某一个达到上界时 后面都是加0 所以不影响结果 
		int temp=a.d[i]+b.d[i]+carry;
		//个位数为改位的结果 
		c.d[c.len++]=temp%10;
		//十位数为进位 
		carry=temp/10;
	} 
	//如果最后进位不等于0,则再进一位 
	if(carry!=0)
	{
		c.d[c.len++]=carry;
	}
	return c;
}

//传入的应该是a>b 
bign sub(bign a,bign b)
{
	bign c;
	//如果a<b 交换a 和 b 同时要输出负号 
	if(compare(a,b)==-1) swap(a,b); 

	for(int i=0;i<a.len||i<b.len;i++)
	{
		if(a.d[i]<b.d[i])
		{
			a.d[i+1]--;
			a.d[i]+=10;
		}
		c.d[c.len++]=a.d[i]-b.d[i];
	}
	while(c.len-1>=1&&c.d[c.len-1]==0)
	{
		c.len--; //去掉高位的0,同时保留至少一位数 
	}
	return c;
}

//高精度乘法  如果有负号 传入绝对值 最后输出负号 
bign multi(bign a,int b)
{
	bign c;
	int carry=0;
	for(int i=0;i<a.len;i++)
	{
		int temp=a.d[i]*b+carry;
		c.d[c.len++]=temp%10; //取个位 
		carry=temp/10; //取高位部分进位 
	}	
	//如果最后还有进位 
	while(carry!=0)
	{
		c.d[c.len++]=carry%10;//取个位 
		carry/10;//再舍去一位 
	} 
	return c;
}

//高精度除法,r为余数 
bign divide(bign a,int b,int &r)
{
	bign c;
	c.len=a.len;//被除的每一位和商的每一位都是对应的
	for(int i=a.len-1;i>=0;i--)
	{
		r=r*10+a.d[i]; //和上一位余数组合成的临时数
		 
		if(r<b) c.d[i]=0; //不够除 该位为0 
		else//够除 
		{
			c.d[i]=r/b;
			r=r%b;
		}
	} 
	while(c.len-1>=1&&c.d[c.len-1]==0)
	{
		c.len--; //去掉多余的0 同时最多保留一位 
	} 
	return c;
}
void print(bign a)
{
	for(int i=a.len-1;i>=0;i--)
	{
		printf("%d",a.d[i]);
	}
}

int main()
{
	char str1[1000],str2[1000];
	scanf("%s%s",str1,str2);
	bign a=change(str1);
	bign b=change(str2);
//	print(add(a,b));
	print(sub(a,b));
} 

猜你喜欢

转载自blog.csdn.net/hhmy77/article/details/82778983