鱼C论坛

 找回密码
 立即注册
查看: 1647|回复: 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

#define MAX_LEN 200

int main()
{
    char a[MAX_LEN] = {'\0'};
    char b[MAX_LEN] = {'\0'};
    char sum[MAX_LEN+1] = {'\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[i] = c;
            }
            else
            {
                b[i] = 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[i]-48; // 字符'0'转整 (int)'0'-48
        }

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

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

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


    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-18 00:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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