【C++】利用string实现大数相加

引言:
在我们学习了加法运算之后,了解了int型最大可以表示到2的32次方,但是若要计算更大的数呢??

解法:
我们利用string来储存数字,string可以存放很多字符,而每一个数字都有对应的ASCII值,如下图
在这里插入图片描述

对照码表,假如我的字符中某个字符为1,他的实际的值是49(对照ASCII表)。所以想要得到真正的数值就可以让
当前位数对应的值=数字在码表中对应的值-48。
在过程中还需要考虑到进位的问题,可以通过两个数对应的位数字相加得到的数字判断是否大于10,如果大于10,就当前位数的数字等于除10的余数,再记录进位的数值,我让他为flag(如果大于10,flag=1;小于10,flag=0
比如:18+9 结果是个位的值变成(8+9)%10=7 ,并且要进位,所以flag=1;再比如11+12 个位值是1+2=3
不用进位,所以flag=0;
还需要考虑到的是,如果是99+2这样的数时,答案101是三位数,可是99是两位数,循环次数(不懂这句话可以先看代码)和最长位数相等,这里是2次,不会再往下进行,输出结果实际是01,要怎么办?
此时可以引入头文件string,使用Insert(插入)函数,将进位1插入到第一位中,就得到答案101了。

#include<iostream>
#include<string>
using namespace std;
void exchange(string& n1, string& n2)//我让n1是比较长的那个,如果不满足就交换他们
{
	string t;
	if (n1.length() < n2.length())
	{
		t = n1;
		n1 = n2;
		n2 = t;
	}
}
void Addnumber(string &n1, string n2)//最后加得的值我返回到n1上,这就是为什么我要交换的原因
{
	int aLen =n1.length(), bLen = n2.length(), a, b, flag = 0, sum;
	while (aLen > 0)		//直到最大位数n1[0],即第一个字符(最大位数)的位置
	{

		a = n1[aLen - 1]-48;//这个位数的数字加上一个位数的十位值,若无,则flag=0;
		if (bLen > 0)
			b = n2[bLen - 1]-48;
		else
		{
			b = 0;	//如果此时b位数不存在,即此位为0
		}

		sum = a + b + flag;		//相同位的数字相加
		flag = 0;			//使用过后初始化
		if (sum >= 10)		//大于10需要进位
		{
			n1[aLen - 1] = sum % 10+48;
			flag = 1;		//大一位的数字需要加1
		}
		else
			n1[aLen - 1] = sum+48;
		aLen--;
		bLen--;

	}
	if (flag == 1)
		n1.insert(0, "1");
}

int main()
{
		string n1, n2;
		cin >> n1;
		cin >> n2;
		exchange(n1, n2);
		Addnumber(n1, n2);
		cout << n1 << endl;
	

}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值