C++ 大数相加
写在前面
首先,我们需要搞懂什么是“大数”。一般而言,大数往往说的是数据长度可能很大,int、long、long long无法存放。比如说:在16位的机器中,unsigned int的最大长度为 2^16 - 1(也就是65536-1=65535)。但是现实中,非常可能会遇到比这个数字更大的数字运算,所以也就是为什么会有标题所说的“大数相加”了。
基本思路
将数字先存储在字符串中,再在字符串中从“低位”开始,逐个取数字进行十进制的加法运算,然后再把结果记录到字符串中。
示例代码
#include <iostream>
#include <string>
using std::endl;
using std::string;string BigNumberPlus(string num1, string num2)
{//默认使得num1位数大于num2,方便后续运算。if (num1.size() < num2.size()){string temp = num2;num2 = num1;num1 = temp;}//初始化位数、进位标志、定义转换数字a、b和sumint lenth1 = num1.size(), lenth2 = num2.size(), flag = 0, a, b, sum;while (lenth1 > 0) {//lenth1总是大于等于lenth2a = num1[lenth1 - 1] - '0';//转换为数字if (lenth2 > 0) {b = num2[lenth2 - 1] - '0';//转换为数字}else {b = 0;//num2位数加完了}sum = a + b + flag;//当前位加进位if (sum >= 10) {//进位判断flag = 1;//进位标记num1[lenth1 - 1] = '0' + sum % 10;//取个位}else {flag = 0;//进位标记清除num1[lenth1 - 1] = '0' + sum;}//每次向前进位lenth1--;lenth2--;}if (flag) {num1 = "1" + num1;//当最高位进位,在前面加1}return num1;//返回得到的和
}int main()
{std::string v1 = "1234567890000000000";std::string v2 = "987654321";string ret = BigNumberPlus(v1, v2);std::cout << ret << endl;//1234567890987654321return 0;
}