HDU:Integer Inquiry

Integer Inquiry

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 17861    Accepted Submission(s): 4650


Problem Description
One of the first users of BIT's new supercomputer was Chip Diller. He extended his exploration of powers of 3 to go from 0 to 333 and he explored taking various sums of those numbers. 
``This supercomputer is great,'' remarked Chip. ``I only wish Timothy were here to see these results.'' (Chip moved to a new apartment, once one became available on the third floor of the Lemon Sky apartments on Third Street.) 
 

Input
The input will consist of at most 100 lines of text, each of which contains a single VeryLongInteger. Each VeryLongInteger will be 100 or fewer characters in length, and will only contain digits (no VeryLongInteger will be negative). 

The final input line will contain a single zero on a line by itself.
 

Output
Your program should output the sum of the VeryLongIntegers given in the input. 


This problem contains multiple test cases!

The first line of a multiple input is an integer N, then a blank line followed by N input blocks. Each input block is in the format indicated in the problem description. There is a blank line between input blocks.

The output format consists of N output blocks. There is a blank line between output blocks.
 

Sample Input
  
  
1 123456789012345678901234567890 123456789012345678901234567890 123456789012345678901234567890 0
Sample Output
  
  
370370367037037036703703703670

解题思路:
这道题用大数算法,我们知道这么大的数用整型去存储会溢出的,因此我们按照字符串去处理。
我们先把两个要运算的字符串进行逆置,就想我们平时在做加法题时候,都是从低位往高位加并伴随着进位。
but这个题有一个坑就是输入0要输出0

题目代码:
#include<stdio.h>
#include<string.h>
char a[2000];  //存放和
char b[2000];   //存放输入的数
char c[2000];
int main()
{
    int N,i;
    scanf("%d",&N);
    while(N--)
    {
        memset(b,'0',sizeof(b));    //先将数组b刷成字符0
        while(1)                    //永循环
        {
            scanf("%s",a);   //输入要相加的数字
            if(!strcmp(a,"0"))   //看着字符串是不是0,是0结束
                break;
            memset(c,'0',sizeof(c));  //先将数组c刷成字符0
            int len=strlen(a);    //测a的长度
            for(i=0;i<len;i++)
                c[len-i-1]=a[i];   //对a中字符进行逆置
            int ans=0;             //ans代表进位,最初为0
            for(i=0;i<2000;i++)
            {
                int temp=(c[i]-'0')+(b[i]-'0')+ans;  //相应位置上的数字相加并加上该位的进位。
                if(temp>9)
                    ans=temp/10;  //进位
                else
                    ans=0;
                b[i]=temp%10+'0';
            }
        }
        for(i=2000-1;i>=0;i--)//去除前导0
            if(b[i]!='0')
                break;
        if(i==-1)//这种情况是输入的所有数都为0
            printf("0"); //如果输入的是0,要输出0
        else
        {
            for(;i>=0;i--)//
                printf("%c",b[i]);
        }
        printf("\n");
        if(N>0)//格式控制
            printf("\n");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值