PeterNzz 发表于 2022-4-4 09:29:16

200位以内的大整数相加问题

要求:多组输入,每组两个数字,放在一行,数字中间有一个空格。数字均不超过200位,输出这组数字之和。例如,输入:123 456,输出579
疑问:1.编译没有问题,但是为什么输出的时候结果是 :三行“0”数字,如下
                                                                                 0
                                                                                 0
                                                                                 0
         2.如果要求多组输入的两个数字不在一行,而是分为上下两行,输入的语句应该怎么改?
代码:
#include<stdio.h>
#include<string.h>
int main()
{
        int big_integ_1={0};
        int big_integ_2={0};//用来存放两组大整数
        char big_strin_1={'\0'};
        char big_strin_2={'\0'};//用来存放两组大整数的字符形式
       
        while(scanf("%c %c",&big_strin_1,&big_strin_2)!=EOF)
        {
                for(int i=0;int j=strlen(big_strin_1)-1;j>=0)
                {
                        big_integ_1=big_strin_1-'0';
                }
                for(int i=0;int j=strlen(big_strin_2)-1;j>=0)
                {
                        big_integ_2=big_strin_2-'0';//分别把字符形式的大整数放到整型数组中
                }
               
               
                int p=0;
                while(p<=200)
                {
                        big_integ_1+=big_integ_2;
                        if(big_integ_1>=10)
                        {
                                big_integ_1++;
                                big_integ_1-=10;
                        }
                        p++;
                }//将两组大整数相加,如果>=10,则进1 ,前面数字的位数小于后面的
               
                int mark=0;
                int i;
                for(i=200;i>=0;i--)
                {
                        if(big_integ_1!=0)
                        mark=i;
                        break;
                }//从后往前,寻找第一个不为零的数,该数字的位数最大
               
               
                if(i==-1)
                printf("0\n");//说明遍历了整个数组都是0,最后输出0
               
                else
                {
                        for(int k=mark;k>=0;k--)
               {
                        printf("%d",big_integ_1);
               }
                putchar('\n');       
                }//找到了第一个不为零的数字,并倒序输出,以确保 大位数字输出时在前
               
        }
        return 0;
}

ba21 发表于 2022-4-4 20:38:02

多组输入 不知道是何意。是一次输入多组?还是循环输入多组。
如果是一次输入多组,那么题意是不是还要加个条件,最多不能超过多少组。
题意描述的不清不楚。如果这就是是原题那么这个出题的老师没出好。
你的代码我是没法改,我上了我的代码给参考:
#include<stdio.h>
#include<stdlib.h>

#define MAX_LEN 200

int main()
{
    char a = {'\0'};
    char b = {'\0'};
    char sum = {'\0'};
    char c;
    int i, j, k, second, aLen, bLen, len, tmp, tmpA, tmpB, cs;

    // 获取输入 保存到a和b中
    i=0;
    second = 0;
    while( (c=getchar())!='\n' )
    {
      if(c!=' ')
      {
            if(!second)
            {
                a = c;
            }
            else
            {
                b = c;
            }
            i++;
      }
      else
      {
                        aLen = i-1; // 保存a的长度
            i=0;
            second = 1;
      }

    }
        bLen = i-1; // 保存b的长度

        // 保存a,b效长的到len
        len = aLen;
    if (bLen>aLen)
    {
      len = bLen;
    }

        // 相加保存到sum中
    cs = 0; // 进位标志
    for(i=aLen, j=bLen, k=0; len>=0; i--,j--, k++, len--)
    {
      tmpA = 0;
      if(i>=0)
      {
            tmpA = (int)a-48; // 字符'0'转整 (int)'0'-48
      }

      tmpB = 0;
      if(j>=0)
      {
            tmpB= (int)b-48;
      }
      tmp =tmpA + tmpB;

      // 上一组相加是否有进位
      if(cs)
      {
            tmp += cs; // 加上进位
      }
      // 当前是否要进位
      cs = tmp / 10;
      if(cs)
      {
            sum = (char)(tmp%10+48); // 有进位则取个位存储
      }
      else
      {
            sum = (char)(tmp+48); // 转字符串存储
      }
    }
    k -= 1;
    // 最后一位进位处理
    if(cs)
    {
      sum = '1';
    }

        // 反向输出
    for(i=k; i>=0; i--)
    {
      printf("%c", sum);
    }
    printf("\n");


    return 0;
}
页: [1]
查看完整版本: 200位以内的大整数相加问题