大整数的加法、减法和乘法

一、大整数减法

整数的表示采用string, string的begin()为高位,end()为低位。做减法时,先判断两个数字的大小,调整为大数减小数,如果两个数字位数不同,则较小的数字前面补0。

最后要删除前边产生的0,并加上负号。

string BigSubtraction(string s1, string s2)
{
	string result;
	bool Flag = false;
	int carry = 0, len1, len2;
	if(s1 == s2)
	{
		result = "0";
		return result;
	}
	else if(s1.size() < s2.size())
	{
		swap(s1, s2);
		len1 = s1.size();
		len2 = s2.size();
		for(int h = 0; h < len1 - len2; h++)
			s2.insert(s2.begin(), '0');
		Flag = true;
	}
	else
	{   //剩下的情形是s1.size()>=s2.size()
		//如果长度一样,但大小不宜样,调整位置
		if(s1.size() == s2.size() && s1 < s2)
		{
			swap(s1, s2);
			Flag = true;
		}
		len1 = s1.size();
		len2 = s2.size();
		//如果s2本身九比s1断
		for(int h = 0; h < len1 - len2; h++)
			s2.insert(s2.begin(), '0');
	}
	for(int i=s1.size() - 1; i>=0; i--)
	{
		if(carry + (s1[i] - '0') - (s2[i] - '0') < 0)
		{
			carry = carry + 10 + (s1[i] - '0') - (s2[i] - '0');
			result.insert(result.begin(), carry + '0');
			carry = -1;
		}
		else
		{
			carry = carry + (s1[i] - '0') - (s2[i] - '0');
			result.insert(result.begin(), carry + '0');
			carry = 0;
		}
	}
	int f = 0;
	while(result[f] == '0')
	{
		result.erase(result.begin());
	}
	if(Flag == true)
		result.insert(result.begin(), '-');

	return result;
}
二、大整数加法

首先两个大整数通过补0对齐,然后再计算。最后加上进位。

string BigAdd(string s1, string s2)
{
	string c;
	int carry = 0;
	int len2 = s2.size() - 1;
	int len1 = s1.size() - 1;
	int max;
	if(len1 > len2)
	{
		max = len1;
		for(int j = 0; j < len1 - len2; j++)
			s2.insert(s2.begin(), '0');
	}
	else
	{
		max = len2;
		for(int h = 0; h < len2 - len1; h++)
			s1.insert(s1.begin(), '0');
	}

	for(int i = s1.size()-1; i>=0; i--)
	{
		carry += s1[i] - '0';
		carry += s2[i] - '0';
		c.insert(c.begin(), carry%10 + '0');
		carry /= 10;
	}
	if(carry>0)
		c.insert(c.begin(), carry%10 + '0');
	return c;
}

三、大整数乘法

string multiplication(string str1, string str2)
{
	int maxsize = 200;   //表示计算结果的长度
	int a[210], b[210], c[410];
	int i;
	for(i = 0; i<maxsize+10; i++)
		a[i] = b[i] = 0;
	for(i = 0; i < maxsize*2 + 10; i++)
		c[i] = 0;
	int len1, len2;
	len1 = str1.size();
	len2 = str2.size();
	int j;
	for(j=0, i=len1-1; i>=0; i--)
		a[j++] = str1[i] - '0';
	for(j=0, i=len2-1; i>=0; i--)
		b[j++] = str2[i] - '0';
	for(i = 0; i < len2; i++)
	{
		for(j = 0; j < len1; j++)
			c[i+j] += b[i]*a[j];
	}
	//循环处理进位
	for(i = 0; i < maxsize*2; i++)
	{
		if(c[i] >=10)
		{
			c[i+1]+=c[i]/10;
			c[i]%=10;
		}
	}
	string Result = "";
	for(i = maxsize*2; (c[i]==0)&&(i>=0); i--);
	if(i>=0)
		for(; i>=0; i--)
			Result += c[i]+'0';
	else
		Result = "0";

	return Result;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值