当前位置: 代码迷 >> 综合 >> Input-Output Lecture (3) for ACM Freshman
  详细解决方案

Input-Output Lecture (3) for ACM Freshman

热度:88   发布时间:2023-12-06 03:43:20.0

Description

给出两个正整数a和b,计算a+b的值。

Input

第一行是一个数字T,代表有T组输入。


接下来有T行,每行代表一组输入,每组包含两个不超过1000位的正整数a和b。

Output

对于每组输入,输出两行,第一行为”Case i:”(不包含双引号,其中i为第i组测试数据),第二行为a+b的值,每组测试数据之后加一个空行。

Samples

input Copy

2 1 5 1000000000000000000000000000000 1000000000000000000000000000000

output Copy

Case 1: 6 Case 2: 2000000000000000000000000000000

Hint

如果做过前面的题目,此题在输入输出格式上不会碰到啥问题,相较于Lecture (1) 的格式,只是多了测试数据的计数而已和最后的回车而已。本题的主要问题在于如何储存长达1000位的整数并让它们相加,显然使用int或long long都没法存下这个“庞然大物”。此时我们需要另寻它法。如果你用的是Java,那么本题你可以使用Java内置的BigInteger类轻松解决,如果是C/C++,那么本题只能使用长度为1000的数组来储存这个数字了,为了方便读入,可以使用字符串来储存这些数字,并模拟加法使他们相加。这里还需要注意,a和b都不超过1000位,但它们相加的值可能超过1000位,因此在用C风格字符串时,需要格外注意数组是否足够大。

因此我们可以写出如下代码:

#include <stdio.h>
#include <string.h>
void change(char w[]);
char w1[1002],w2[1002],w3[1002];
int main(void)
{
    int i,sum,add,t,count=0;
    scanf("%d",&t);
    getchar();
    while(t--)
    {
        ++count;
        scanf("%s %s",w1,w2);
        getchar();
        change(w1);
        change(w2);
    //    puts(w1);
    //    puts(w2);
        add=0;
        for(i=0;i<strlen(w1)||i<strlen(w2);++i)
        {
            if(i<strlen(w1)&&i<strlen(w2))
                sum=w1[i]-'0'+w2[i]-'0'+add;
            else if(i<strlen(w1))
                sum=w1[i]-'0'+add;
            else if(i<strlen(w2))
                sum=w2[i]-'0'+add;
            add=0;    
            if(sum>9)
            {
                add=1;
                sum-=10;    
            }    
            w3[i]=sum+'0';
        }
    //    printf("%c\n",w3[0]);
    //    printf("%d\n",i);
    //    i=i-1;
        if(add==1) w3[i++]=add+'0';
    //    i=i+1;
    //    printf("%d\n",i);
    //  printf("%c\n",w3[1]);
        printf("Case %d:\n",count);
        for(i--;i>=0;i--)
        {
            printf("%c",w3[i]);
        }
        puts("\n");
    } 
    return 0;
}
void change(char w[])
{
    char t;
    int x=0,y=strlen(w)-1;
    while(x<y)
    {
        t=w[x];
        w[x]=w[y];
        w[y]=t;
        x++;
        y--;
    }
}

//高精度加法,注意点就是先输入之后,要去先将其逆序一下因为是从各位开始的,然后进入加的环节,一个for三个判断条件,再加一个if最后还要判断这样完了之后,有无进制,然后去掉前导0,逆序输出结果就行

  相关解决方案