杨过丶安慕希 发表于 2018-10-9 18:49:12

各位大佬,高精度加法程序如何写

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

486546546546465
这种

claws0n 发表于 2018-10-9 19:01:20

a = 1654864516546412346546 + 486546546546465 {:10_277:} 不然你想怎样?

gary冥霧 发表于 2018-10-9 21:55:04

如果你是指計算超出int範圍的數的話,那你只要用long int或long long int就可以了!!{:5_106:}




但如果是浮點數那就直接用double即可!!!{:5_105:}


不知是否回答你的問題,還請你找出最佳解答!!!!感謝!!!{:5_105:}

1005204767 发表于 2018-10-10 00:23:42

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

/*相加时,先将右边对齐,即将i指向a的右端,j指向b的右端,
    然后i、j对齐,同步向左移动,直到其中一个到头为止*/
    for(i = m - 1, j = n - 1, k = len - 1; i >= 0 && j >= 0; i--, j--, k--)
    {
      c = (a - '0' + b - '0' + flag) % 10 + '0';
      flag = (a - '0' + b - '0' + flag) / 10;
    }
    for(; i >= 0; i--, k--)/*若a更长,即a没有处理完,处理a剩下的高位部分*/
    {
      c = (a - '0' + flag) % 10 + '0';
      flag = (a - '0' + flag) / 10;
    }
    for(; j >= 0; j--, k--)/*若b更长,则方法同上*/
    {
      c = (b - '0' + flag) % 10 + '0';
      flag = (b - '0' + flag) / 10;
    }
    if(flag != 0) /*若最终的最高位进位信息不为0*/
    {
      for(k = len; k > 0; k--)
            c = c;
      c = flag + '0';
    }
    printf("%s + %s = %s\n", a, b, c);
}
页: [1]
查看完整版本: 各位大佬,高精度加法程序如何写