char s1[M], s2[M];
int num1[M] = {0}; // 数字数组num1
int num2[M] = {0}; // 数字数组num2
scanf("%s %s", s1, s2);
len_s1 = strlen(s1); // 求第一个加数的位数
len_s2 = strlen(s2); // 求第二个加数的位数
直接开干,上面的M就是你自己定义的位数,这里你随意。一般定义100左右就行了,100位数,已经大得相当吓人。 for(i=len_s1-1, j=0; i>=0; i--) //将字符数组转化为数字数组,并倒数存放,作为第一个加数
{
num1[j] = s1[i] - '0';
j++;
}
for(i=len_s2-1, j=0; i>=0; i--) //将字符数组转化为数字数组,并倒数存放,作为第二个加数
{
num2[j] = s2[i] - '0';
j++;
}
将字符串转换为数字,需要-‘0’,然后最重要的一步就是为什么需要倒序呢?因为我们的加法就是从右到左的,1000+1000是0和0先加,而不是1和1先加,所以需要做一个倒序。如果整不明白的话,可以直接列出一条加法竖式就一目了然了。 for(i=0; i<=M; i++) //实现大数的加法
{
num1[i] = num1[i]+num2[i];
if(num1[i]>9)
{
num1[i] = num1[i]-10;
num1[i+1]++;
}
}
最后进行加法的模拟运算就行了,这里需要记得num1[i+1]++;进位操作,如果这个位置上面是大于等于10的数字,那么我们就需要进行进位。这也是在模拟我们的加法竖式而已。 上面是效果图。 上面的图,我只是随便写了两个数字,更复杂的数字也是可以计算出来的。 然后拓展思考一下,除了大数加法,我们还可以做大数减法,大数乘法,大数除法这些练习。原理不变,就是用数组来模拟平台的算数运算而已。 更加高阶一点的话,我们可以做带有小数点的运算。 作者:啦啦啦1646846
链接:https://juejin.cn/post/7023572827278147592
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。原文始发于微信公众号(汇编语言):c++算法,大数加法
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论