高精度正整数加法

1.原理

使用的是模拟手算的方法
例如:123456+1234

123456
+1234
=124690

我们手算时都是从最右边开始竖着的那位相加的,依次向左重复竖着相加

2.函数型代码

//s1长度长,s2短
//这里使用引用参数(&)是为了不要再生成s1,s2字符串
void Add(string& s1, string& s2)
{
	//使longStr指向长度较长的那个字符串,
	//shortStr指向较短的那个字符串
	string* longStr, * shortStr;
	longStr = s1.length() >= s2.length() ? &s1 : &s2;
	shortStr = s1.length() < s2.length() ? &s1 : &s2;
	
	int cnt = 0;	//记录进位,初始化为0,无进位
	int pos1 = (*longStr).length() - 1, pos2 = (*shortStr).length() - 1, temp;	//从字符串最后一位一位一位向前移动,模拟加法
	
    //pos1为长字符串的“指针”,pos2为短字符串的“指针”
	while (pos1 >= 0) {
		if (pos2 >= 0)
			temp = ((*longStr)[pos1] - '0') + ((*shortStr)[pos2--] - '0') + cnt;
		else 
			temp = (*longStr)[pos1] - '0' + cnt;
		
		if (temp > 9)
			cnt = 1;
		else
			cnt = 0;

		temp = temp % 10;
		(*longStr)[pos1--] = '0' + temp;
	}
	if (cnt == 1)
		(*longStr) = "1" + (*longStr);

	return (*longStr);
}

int main()
{
	string s1, s2, * p1, * p2;
	int len1, len2;

	cin >> s1 >> s2;
	len1 = s1.length();
	len2 = s2.length();
	
 	//p1指向长的字符串,p2指向短的字符串
	if (len1 > len2)
	{
		p1 = &s1;
		p2 = &s2;
	}
	else
	{
		p1 = &s2;
		p2 = &s1;
	}

	//相加
	Add(*p1, *p2);

	return 0;
}

注意这两句

	longStr = s1.length() >= s2.length() ? &s1 : &s2;
	shortStr = s1.length() < s2.length() ? &s1 : &s2;

不能同时使用<>号,因为如果两个字符串长度相等时,这两个字符指针会指向同一个字符串。

3.重载+号代码

为了使用方便,一边会选择重构+号,使+能够对字符串进行我们这个高精度正整数加法

//重载+
string operator +(string &s1, string &s2)
{
	string* longStr, * shortStr;
	longStr = s1.length() >= s2.length() ? &s1 : &s2;
	shortStr = s1.length() < s2.length() ? &s1 : &s2;
	
	int cnt = 0;	//记录进位,初始化为0,无进位
	int pos1 = (*longStr).length() - 1, pos2 = (*shortStr).length() - 1, temp;	//从字符串最后一位一位一位向前移动,模拟加法
	
    //pos1为长字符串的“指针”,pos2为短字符串的“指针”
	while (pos1 >= 0) {
		if (pos2 >= 0)
			temp = ((*longStr)[pos1] - '0') + ((*shortStr)[pos2--] - '0') + cnt;
		else 
			temp = (*longStr)[pos1] - '0' + cnt;
		
		if (temp > 9)
			cnt = 1;
		else
			cnt = 0;

		temp = temp % 10;
		(*longStr)[pos1--] = '0' + temp;
	}
	if (cnt == 1)
		(*longStr) = "1" + (*longStr);

	return (*longStr);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值