大数相加
多个非负的整数(长度超越long和int)求和,即可所谓的大数相加。
输入多个只包含数字的字符串(用来表示大数),求相加之后的数字结果。
例子:
输入:
3
11111111111111111
99999999999999999
24456131321
输出:
111111135567242431
用C++编写代码如下:
#include<iostream> #include<string> #include<vector> using namespace std; //实现两个大数(字符串)的相加,并返回string类型计算结果 string add(string str_1,string str_2) { string result;//保存计算结果,倒序保存 string temp; bool carryFlag = false;//进位标志,false表述不进位,true表示进位 string maxString = (str_1.size()>=str_2.size())? str_1 : str_2; string minString = (str_1.size()<str_2.size())? str_1 : str_2; //将短字符串补齐到和长字符串一样长,在短字符串前边补上字符'0' int maxLength = maxString.size(); int minLength = minString.size(); temp.append((maxLength - minLength),'0').append(minString); minString.clear(); minString.append(temp); //字符串进行倒序遍历,按位相加 for(int i=(maxString.size()-1);i>=0;i--) { int res; if(carryFlag)//有进位,计算结果res加1;无进位不加1。 res = (maxString[i]-48)+(minString[i]-48)+1;//字符'0'在ASCII表中对应十进制数是48 else res = (maxString[i]-48)+(minString[i]-48); //判断结算结果res是否产生进位,进位标志carryFlag 的状态也要随之改变 if(res<10) carryFlag = false;//res无进位 else carryFlag = true;//res有进位 result.push_back((res%10)+48);//将res取10的余数转换为字符保存 } //循环结束后,最后还需要判断一次进位标志,判断两个字符串最后一次相加是否产生进位 if(carryFlag) result.push_back(49);//计算结果是倒序保存,所以在最后添加字符'1' reverse(result.begin(),result.end());//将计算结果逆置就是实际计算结果 return result; } //将接收到的输入的string全部保存在vector中,进行循环相加,最终返回计算结果 string sumResult(vector<string> bigNumber) { string res = bigNumber[0]; for(int i=1;i<bigNumber.size();i++) { res = add(res,bigNumber[i]); } return res; } int main() { vector<string> bignumber; int n;//输入字符串总个数 cin>>n; for(int i=0;i<n;i++) { string str; cin>>str;//输入字符串 bignumber.push_back(str);//所有输入字符串全部保存在vector中 str.clear(); } string result = sumResult(bignumber); cout<<result<<endl; return 0; }
VisualStudio2017实际结果控制台输出
关键点说明:
1.输入的字符串有多个,所以可以全部保存在vector中。
2.遍历vector时候,由于字符串的长度并不相同,所以需要将两个字符串补齐,补充字符'0'。此处要了解append()函数的两种重载 形式:
(1)在字符串的结尾拼接字符串
string str = "1234"; str.append("abcd");//str就为"1234abcd"
(2)在字符串的结尾拼接字符
string str = "1234"; str.append(3,'a');//str就为"1234aaa"
3.两个相加的字符串,采取倒序遍历按位相加,每次相加之前需要将字符转化为实际对应的数值(减去字符'0'对应的十进制数48),相加的结果进行保存之前进行两次判断。计算结果保存前需要转化为对应的字符,push_back()函数的作用是在字符串的结尾添加一个字符。(要注意区别push_bank()和append()函数的作用)
(1)第一次判断,是判断上一次计算是否产生进位,如果上一次计算产生进位,当前计算结果要加一;
(2)第二次判断,是判断当前计算结果是否产生进位,随之改变进位标志位状态。
4.在两个字符串完成遍历后还需要判断一下进位标志,判断两个字符串最后一次相加是否产生进位,如果产生进位,在计算结果的结尾添加字符'1'(十进制整数49)。
5.计算结果的保存是逆序的,主要是便于存放于字符串中,在最后返回值前,需要将计算结果逆置。