c++算法,大数加法

admin 2023年2月12日11:56:59评论10 views字数 1197阅读3分59秒阅读模式
这是写给一些新人大学生的知识点,大神可以直接划走。
相信在大学时候打过算法竞赛的同学都已经在一开始接触过大数加法。有人会说,加法不是直接用+直接相加就行了吗?
的确例如 int a ; int b 直接相加可以得出 int c
如果数和小的话,的确是可以的但是如果数字是:100000000000000000000000000....省略几百位。
这样子的数字是int存不下的,就算你的int64最多也就存2的32次方-1这个数字已经是最大了,注意这里还有负数的存在,所以是2的32次方-1,而不是64次方。所以我们应该需要怎么办呢?
答案是数组,例如int a[300]这样的数字就可以存到300位数字。
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的数字,那么我们就需要进行进位。这也是在模拟我们的加法竖式而已。
c++算法,大数加法
上面是效果图。
上面的图,我只是随便写了两个数字,更复杂的数字也是可以计算出来的。
然后拓展思考一下,除了大数加法,我们还可以做大数减法,大数乘法,大数除法这些练习。原理不变,就是用数组来模拟平台的算数运算而已。
更加高阶一点的话,我们可以做带有小数点的运算。

作者:啦啦啦1646846
链接:https://juejin.cn/post/7023572827278147592
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

原文始发于微信公众号(汇编语言):c++算法,大数加法

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年2月12日11:56:59
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   c++算法,大数加法https://cn-sec.com/archives/1549426.html

发表评论

匿名网友 填写信息