大数相加算法,基于C++

自己在做蓝桥杯题目是,发现了很多需要大数计算的算法,查阅相关资料,东西冗杂,决定自己写算法。

先做大数相加算法。

两个相加的大数的极限就是编译器字符串能接纳位数的极限。

采用C++中得string类作为容器。首先准备三个容器,str1与str2接受数据,result接纳相加结果,原理就是模拟加法的手工计算,先从低位开始相加,若超过10则进1。

其中有很多细节性问题,我列举一下:

  • 1、str1要作为位数最长的一个,方便计算,因此要首先确保str1位数最长,可以通过两数交换实现。
  • 2、result初始状态的长度要与str1相同,但是在运算过程中可能发生两数相加,结果长度超过了其中最长的一位,比如900+300,很显然,结果是4位,这种结果的出现只可能是两个位数相同的数相加才可能发生,而且最多超出1位。因此我们必须考虑到这种情况,解决办法如果是我们发现了最高位需要进位,则令result = ‘1’+   result;将1放在首位就解决了。另外在最后输出我们的字符串的长度为length + 1,因为我们可能最高位进位了,长度+1,就算没有进位,也没有关系,我们将输出一个\0,也就是空字符。

下面是代码,算法比较粗糙,大家有意见,及时指正。

#include<iostream>
#include<string>

using namespace std;

int main()
{
	int i = 0, j = 0;
	string temp = "0";
	string str1;
	string str2;
	cin>>str1>>str2; //接受数据 
	if(str1.length() < str2.length())
	{
	//交换两个字符串,使位数长的位于str1 
		temp = str1;
		str1 = str2;
		str2 = temp;
	}
	long length1 = str1.length();
	long length2 = str2.length();
	long length = length1;
	string result(length, '0');

	//两数相加,超过10进1 
	for(i = length - 1, j = length2 - 1; i >= 0 && j >= 0; i--, j--)
	{
		long sum = 0;
		sum = (str2[j] - '0') + (str1[i] - '0') + (result[i] - '0');
		if(sum > 9)
		{
			sum %= 10;
			result[i] = sum + '0'; 
			if(i != 0)
			 result[i-1] = '1';
			else
			 result = '1' + result;
		}
		else
		{
			result[i] = sum + '0';
		}
	}
	
	//str2的长度小于str1的话,将剩余的str1加到result上 
	for(;i >= 0; i--)
	{
		long sum = 0;
		sum = (str1[i] - '0') + (result[i] - '0');
		if(sum > 9)
		{
			sum %= 10;
			{
				result[i] = (sum + 1) + '0'; 
			}
			result[i-1] = '1';
		}
		else
		{
			result[i] = sum + '0';
		}
	}
	
//输出结果,注意length+1 
	for(i = 0; i < length + 1; i++)
		cout<<result[i];
	return 0;	
} 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值