大数指采用正常数据类型无法进行计算的数字,本文采用string类型存储和计算。
#include <iostream>
#include <algorithm>
using namespace std;
// 通过下标实现
string BigDataAdd(string str1, string str2) {
int temp = 0; // 相加之和的个位
int cp = 0; // 进位
string strRet; // 相加结果的字符串
int lenlong = str1.length() > str2.length() ? str1.length() - 1 : str2.length() - 1;
int lenshort = str1.length() > str2.length() ? str2.length() - 1 : str1.length() - 1;
string strlong = str1.length() > str2.length() ? str1 : str2;
string strshort = str1.length() > str2.length() ? str2 : str1;
while (lenlong >= 0) {
if (lenshort >= 0) {
temp = ((strlong[lenlong] - '0') + (strshort[lenshort] - '0') + cp) % 10;
cp = ((strlong[lenlong] - '0') + (strshort[lenshort] - '0') + cp) / 10;
--lenlong;
--lenshort;
} else {
temp = ((strlong[lenlong] - '0') + cp) % 10;
cp = ((strlong[lenlong] - '0') + cp) / 10;
--lenlong;
}
strRet = to_string(temp) + strRet;
}
strRet = cp > 0 ? to_string(cp) + strRet : strRet; //记得加上最后一个进位的值
return strRet;
}
// 通过迭代器实现
string BigDataAdd(string str1, string str2)
{
string str;
int cp = 0;
int temp = 0;
auto p = str1.length() > str2.length() ? str1.rbegin() : str2.rbegin();
auto q = str1.length() > str2.length() ? str1.rend() : str2.rend();
auto m = str1.length() > str2.length() ? str2.rbegin() : str1.rbegin();
auto n = str1.length() > str2.length() ? str2.rend() : str1.rend();
while(p != q)
{
if (m != n)
{
temp = ((*p - '0') + (*m - '0') + cp) % 10;
cp = ((*p - '0') + (*m - '0') + cp) / 10;
++p;
++m;
}
else
{
temp = ((*p - '0') + cp) % 10;
cp = ((*p - '0') + cp) / 10;
++p;
}
str += to_string(temp);
}
reverse(str.begin(), str.end());
return str;
}
int main(int argc, char **argv) {
string str1, str2;
cout << "str1 : ";
cin >> str1;
cout << "str2 : ";
cin >> str2;
string strAddRet = BigDataAdd(str1, str2);
cout << "add ret : " << strAddRet.c_str() << endl;
return 0;
}
同样也可以用vector
来做,效果是一样的。不过需要使用函数string_to_array
将输入的大数字符串转换为vector
。
网友评论