您的位置:首页 > 编程语言 > C语言/C++

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

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

先做大数相加算法。

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

采用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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息