鱼C论坛

 找回密码
 立即注册
查看: 3503|回复: 3

[已解决]各位大佬,高精度加法程序如何写

[复制链接]
发表于 2018-10-9 18:49:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
怒求高精度加法程序   比如,
1654864516546412346546

486546546546465
这种
最佳答案
2018-10-10 00:23:42
由于数字的长度有限制,因此大数加法的位数也是有限的,
所以可以换种思路,把输入输出均看成字符串,然后对字符串处理(跟我们列竖式一样)
一位运算很容易,我们可以使用+进行运算
并且我们很容易知道每一位的结果都由这一位的 加数 和 被加数 以及上一位的 进位 来决定。
当这三者的和超过10 便是进位,对10取余便是本为的结果。用这种方法理论上我们可以实现无限多位的数相加(只要你内存够大,分配大点的数组存放即可)
  1. #include <stdio.h>
  2. #include <string.h>
  3. void main( ) {
  4.     char a[1000], b[1000], c[1001] = {0}, flag = 0;  /*c:存放结果,flag:进位信息*/
  5.     int i, j, k, m, n, len; /*i:跟踪a的下标,j:跟踪b的下标,k:跟踪c的下标*/
  6.     scanf("%s%s", a, b);
  7.     m = strlen(a);
  8.     n = strlen(b);
  9.     len = (m > n) ? m : n;

  10. /*相加时,先将右边对齐,即将i指向a的右端,j指向b的右端,
  11.     然后i、j对齐,同步向左移动,直到其中一个到头为止*/
  12.     for(i = m - 1, j = n - 1, k = len - 1; i >= 0 && j >= 0; i--, j--, k--)
  13.     {
  14.         c[k] = (a[i] - '0' + b[j] - '0' + flag) % 10 + '0';
  15.         flag = (a[i] - '0' + b[j] - '0' + flag) / 10;
  16.     }
  17.     for(; i >= 0; i--, k--)  /*若a更长,即a没有处理完,处理a剩下的高位部分*/
  18.     {
  19.         c[k] = (a[i] - '0' + flag) % 10 + '0';
  20.         flag = (a[i] - '0' + flag) / 10;
  21.     }
  22.     for(; j >= 0; j--, k--)  /*若b更长,则方法同上*/
  23.     {
  24.         c[k] = (b[j] - '0' + flag) % 10 + '0';
  25.         flag = (b[j] - '0' + flag) / 10;
  26.     }
  27.     if(flag != 0) /*若最终的最高位进位信息不为0*/
  28.     {
  29.         for(k = len; k > 0; k--)
  30.             c[k] = c[k - 1];
  31.         c[0] = flag + '0';
  32.     }
  33.     printf("%s + %s = %s\n", a, b, c);
  34. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-10-9 19:01:20 | 显示全部楼层
a = 1654864516546412346546 + 486546546546465 不然你想怎样?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-9 21:55:04 | 显示全部楼层
如果你是指計算超出int範圍的數的話,那你只要用long intlong long int就可以了!!




但如果是浮點數那就直接用double即可!!!


不知是否回答你的問題,還請你找出最佳解答!!!!感謝!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-10 00:23:42 | 显示全部楼层    本楼为最佳答案   
由于数字的长度有限制,因此大数加法的位数也是有限的,
所以可以换种思路,把输入输出均看成字符串,然后对字符串处理(跟我们列竖式一样)
一位运算很容易,我们可以使用+进行运算
并且我们很容易知道每一位的结果都由这一位的 加数 和 被加数 以及上一位的 进位 来决定。
当这三者的和超过10 便是进位,对10取余便是本为的结果。用这种方法理论上我们可以实现无限多位的数相加(只要你内存够大,分配大点的数组存放即可)
  1. #include <stdio.h>
  2. #include <string.h>
  3. void main( ) {
  4.     char a[1000], b[1000], c[1001] = {0}, flag = 0;  /*c:存放结果,flag:进位信息*/
  5.     int i, j, k, m, n, len; /*i:跟踪a的下标,j:跟踪b的下标,k:跟踪c的下标*/
  6.     scanf("%s%s", a, b);
  7.     m = strlen(a);
  8.     n = strlen(b);
  9.     len = (m > n) ? m : n;

  10. /*相加时,先将右边对齐,即将i指向a的右端,j指向b的右端,
  11.     然后i、j对齐,同步向左移动,直到其中一个到头为止*/
  12.     for(i = m - 1, j = n - 1, k = len - 1; i >= 0 && j >= 0; i--, j--, k--)
  13.     {
  14.         c[k] = (a[i] - '0' + b[j] - '0' + flag) % 10 + '0';
  15.         flag = (a[i] - '0' + b[j] - '0' + flag) / 10;
  16.     }
  17.     for(; i >= 0; i--, k--)  /*若a更长,即a没有处理完,处理a剩下的高位部分*/
  18.     {
  19.         c[k] = (a[i] - '0' + flag) % 10 + '0';
  20.         flag = (a[i] - '0' + flag) / 10;
  21.     }
  22.     for(; j >= 0; j--, k--)  /*若b更长,则方法同上*/
  23.     {
  24.         c[k] = (b[j] - '0' + flag) % 10 + '0';
  25.         flag = (b[j] - '0' + flag) / 10;
  26.     }
  27.     if(flag != 0) /*若最终的最高位进位信息不为0*/
  28.     {
  29.         for(k = len; k > 0; k--)
  30.             c[k] = c[k - 1];
  31.         c[0] = flag + '0';
  32.     }
  33.     printf("%s + %s = %s\n", a, b, c);
  34. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-22 13:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表