灯火阑珊201 发表于 2022-11-7 23:17:25

找个bug,大整数加法问题

题目要求计算两个长度为100以内的正整数之和,我自己写了一个,但是测试数位大了就会有问题,而且还有一个非常奇怪的现象就是如果两个数字的某个数位加起来等于10,就输出不了,求大佬指正!
#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
    char a,b,c;
    gets(a);
    gets(b);
    int lena=strlen(a);
    int lenb=strlen(b);
    int i,j,k=0;
    if(lena>=lenb)
    {
      for(i=lena-1,j=lenb-1; j>=0; k++,j--,i--)
      {
            c+=(a+b-2*'0')%10;
            c=(a+b-2*'0')/10;
      }
      for(i=lena-lenb-1; i>=0; i--)
      {
            c+=a-'0';
      }
    }
    else
    {
      for(i=lena-1,j=lenb-1; i>=0; k++,j--,i--)
      {
            c+=(a+b-2*'0')%10;
            c+=(a+b-2*'0')/10;
      }
      for(i=lenb-lena-1; i>=0; i--)
      {
            c+=b-'0';
      }
    }
    for(i=strlen(c)-1; i>=0; i--) printf("%c",c+'0');
}

jackz007 发表于 2022-11-7 23:55:06

本帖最后由 jackz007 于 2022-11-8 00:03 编辑

      最大的问题是第二个循环没有把前面的进位继续传递下去
#include<stdio.h>
#include<string.h>

int main()
{
      char a , b , c, * p1 , * p2 , t                        ;
      int d1 , d2 , e , i , k , lena , lenb                                     ;
      gets(a)                                                                   ;
      gets(b)                                                                   ;
      lena = strlen(a)                                                          ;
      lenb = strlen(b)                                                          ;
      p1 = (lena < lenb) ? a : b                                                ;
      p2 = (lena < lenb) ? b : a                                                ;
      d1 = (lena < lenb) ? lena : lenb                                          ;
      d2 = (lena < lenb) ? lenb : lena                                          ;
      for(e = k = 0 ; k < d2 ; k ++) {
                if(k < d1) c = p1 - '0' + p2 - '0' + e ;
                else c = p2 - '0' + e                              ;
                e = c / 10                                                   ;
                c %= 10                                                      ;
                c += '0'                                                       ;
      }
      if(e) c = e + '0'                                                   ;
      for(i = 0 ; i < k / 2 ; i ++) {
                t = c                                                ;
                c = c                                             ;
                c = t                                                          ;
      }
      printf("%s\n" , c)                                                      ;
}
      编译、运行实况:
D:\\C>g++ -o x x.c

D:\\C>x
9999999999999999999999999999999999999999999999999999999999999999999999999999
2
10000000000000000000000000000000000000000000000000000000000000000000000000001

D:\\C>

桃花飞舞 发表于 2022-11-8 00:10:07

厉害了,我调试十多分钟没调出来

桃花飞舞 发表于 2022-11-8 21:47:58

jackz007 发表于 2022-11-7 23:55
最大的问题是第二个循环没有把前面的进位继续传递下去

      编译、运行实况:

你的代码错了,不信你自己多测试几次
123456789
123456789
比如这组数
123456789789
123456789789
这组数
算出来的结果都是错的

jackz007 发表于 2022-11-8 21:52:46

本帖最后由 jackz007 于 2022-11-8 21:57 编辑

桃花飞舞 发表于 2022-11-8 21:47
你的代码错了,不信你自己多测试几次
123456789
123456789


D:\\C>g++ -o x x.c

D:\\C>x
123456789
123456789
246913578

D:\\C>x
123456789789
123456789789
246913579578

D:\\C>
      这个答案不对?
      如果有问题,那就是应该在第23、24行之间插入一条语句:
      if(e) c = e + '0'                                                   ;
      c = '\0'                                                               ; // 插入此句即可
      for(i = 0 ; i < k / 2 ; i ++) {

桃花飞舞 发表于 2022-11-8 22:36:16

本帖最后由 桃花飞舞 于 2022-11-8 22:38 编辑

jackz007 发表于 2022-11-8 21:52
这个答案不对?
      如果有问题,那就是应该在第23、24行之间插入一条语句:

嗯,好像可以了,有时间我再测下,你挺溜的,有什么好的资料,或视频推荐么?
页: [1]
查看完整版本: 找个bug,大整数加法问题