引言:100个9加100个9等于多少呢?
聪明的读者你一定会知道简单的相加不能解决并且一定会上溢。那么你可能就会想到用字符串模拟手算过程是否可以呢?
答:恭喜你,你已经解决了问题的一半了;
先举个简单的例子尝试推导算法过程;
999
+ 99
———
将运算步骤拆解成以下过程:
可以总结出,在位数对齐的情况下(不对齐会分类讨论)(结合上图来理解过程),
个位与个位相加的当前结果求出取整(进位)和余数,结果为上一次的进位与当前余数相加后取余;
十位与十位相加的当前结果求出取整(进位)和余数,结果为个位运算的进位与当前余数相加后取余;
百位与百位相加的当前结果求出取整(进位)和余数,结果为十位运算的进位与当前余数相加后取余;
。。。。
最后一位运算进行判断是否有进位,有:结果前添加,没:最后的结果就是当前结果;
(建议自己举个例子模拟上述过程)
简单的来说: string res ;
for(从各位到最后一位逐次处理)
res+=(上一次的进位+当前的余数)%10;
最后一位运算进行判断是否有进位,有:结果前添加,没:最后的结果就是当前结果;
代码:
string a = "10000", b = "999",c;
int jinwei = 0, yushu = 0;
//位数对齐,不足前面补0
if (a.size() > b.size())
{
int t = a.size() - b.size();
for (int i = 0;i < t;i++)
b.insert(0,"0");
}
if (a.size() < b.size())
{
int t = b.size() - a.size();
for (int i = 0;i < t;i++)
a.insert(0,"0");
}
//个位的索引,
int index_max = a.size()-1;
for (int i=index_max;i>=0;i--)
{
yushu = ((a[i] - '0') + (b[i] - '0') + jinwei) % 10;
c.insert(0, to_string(yushu));
//从前面插入余数
jinwei = ((a[i] - '0') + (b[i] - '0') + jinwei) / 10;
}
//处理最后运算的进位
jinwei == 1 ? c += "1" : c = c;
cout << c<<endl;