鱼C论坛

 找回密码
 立即注册
查看: 1845|回复: 1

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

[复制链接]
发表于 2022-4-4 09:29:16 | 显示全部楼层 |阅读模式

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

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

x
要求:多组输入,每组两个数字,放在一行,数字中间有一个空格。数字均不超过200位,输出这组数字之和。例如,输入:123 456,输出579
疑问:1.编译没有问题,但是为什么输出的时候结果是 :三行“0”数字,如下
                                                                                 0
                                                                                 0
                                                                                 0
         2.如果要求多组输入的两个数字不在一行,而是分为上下两行,输入的语句应该怎么改?
代码:
#include<stdio.h>
#include<string.h>
int main()
{
        int big_integ_1[201]={0};
        int big_integ_2[201]={0};//用来存放两组大整数
        char big_strin_1[201]={'\0'};
        char big_strin_2[201]={'\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[i++]=big_strin_1[j--]-'0';
                }
                for(int i=0;int j=strlen(big_strin_2)-1;j>=0)
                {
                        big_integ_2[i++]=big_strin_2[j--]-'0';//分别把字符形式的大整数放到整型数组中
                }
               
               
                int p=0;
                while(p<=200)
                {
                        big_integ_1[p]+=big_integ_2[p];
                        if(big_integ_1[p]>=10)
                        {
                                big_integ_1[p+1]++;
                                big_integ_1[p]-=10;
                        }
                        p++;
                }//将两组大整数相加,如果>=10,则进1 ,前面数字的位数小于后面的
               
                int mark=0;
                int i;
                for(i=200;i>=0;i--)
                {
                        if(big_integ_1[i]!=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[k]);
                 }
                putchar('\n');       
                }//找到了第一个不为零的数字,并倒序输出,以确保 大位数字输出时在前
               
        }
        return 0;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-4-4 20:38:02 | 显示全部楼层
多组输入 不知道是何意。是一次输入多组?还是循环输入多组。
如果是一次输入多组,那么题意是不是还要加个条件,最多不能超过多少组。
题意描述的不清不楚。如果这就是是原题那么这个出题的老师没出好。
你的代码我是没法改,我上了我的代码给参考:
  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. #define MAX_LEN 200

  4. int main()
  5. {
  6.     char a[MAX_LEN] = {'\0'};
  7.     char b[MAX_LEN] = {'\0'};
  8.     char sum[MAX_LEN+1] = {'\0'};
  9.     char c;
  10.     int i, j, k, second, aLen, bLen, len, tmp, tmpA, tmpB, cs;

  11.     // 获取输入 保存到a和b中
  12.     i=0;
  13.     second = 0;
  14.     while( (c=getchar())!='\n' )
  15.     {
  16.         if(c!=' ')
  17.         {
  18.             if(!second)
  19.             {
  20.                 a[i] = c;
  21.             }
  22.             else
  23.             {
  24.                 b[i] = c;
  25.             }
  26.             i++;
  27.         }
  28.         else
  29.         {
  30.                         aLen = i-1; // 保存a的长度
  31.             i=0;
  32.             second = 1;
  33.         }

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

  36.         // 保存a,b效长的到len
  37.         len = aLen;
  38.     if (bLen>aLen)
  39.     {
  40.         len = bLen;
  41.     }

  42.         // 相加保存到sum中
  43.     cs = 0; // 进位标志
  44.     for(i=aLen, j=bLen, k=0; len>=0; i--,j--, k++, len--)
  45.     {
  46.         tmpA = 0;
  47.         if(i>=0)
  48.         {
  49.             tmpA = (int)a[i]-48; // 字符'0'转整 (int)'0'-48
  50.         }

  51.         tmpB = 0;
  52.         if(j>=0)
  53.         {
  54.             tmpB= (int)b[j]-48;
  55.         }
  56.         tmp =  tmpA + tmpB;

  57.         // 上一组相加是否有进位
  58.         if(cs)
  59.         {
  60.             tmp += cs; // 加上进位
  61.         }
  62.         // 当前是否要进位
  63.         cs = tmp / 10;
  64.         if(cs)
  65.         {
  66.             sum[k] = (char)(tmp%10+48); // 有进位则取个位存储
  67.         }
  68.         else
  69.         {
  70.             sum[k] = (char)(tmp+48); // 转字符串存储
  71.         }
  72.     }
  73.     k -= 1;
  74.     // 最后一位进位处理
  75.     if(cs)
  76.     {
  77.         sum[k++] = '1';
  78.     }

  79.         // 反向输出
  80.     for(i=k; i>=0; i--)
  81.     {
  82.         printf("%c", sum[i]);
  83.     }
  84.     printf("\n");


  85.     return 0;
  86. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-25 20:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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