zoukankan      html  css  js  c++  java
  • hdu1002 A + B Problem II

    A + B Problem II

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


    Problem Description
    I have a very simple problem for you. Given two integers A and B, your job is to calculate the Sum of A + B.
     


     

    Input
    The first line of the input contains an integer T(1<=T<=20) which means the number of test cases. Then T lines follow, each line consists of two positive integers, A and B. Notice that the integers are very large, that means you should not process them by using 32-bit integer. You may assume the length of each integer will not exceed 1000.
     


     

    Output
    For each test case, you should output two lines. The first line is "Case #:", # means the number of the test case. The second line is the an equation "A + B = Sum", Sum means the result of A + B. Note there are some spaces int the equation. Output a blank line between two test cases.
     


     

    Sample Input
    2 1 2 112233445566778899 998877665544332211
     


     

    Sample Output
    Case 1: 1 + 2 = 3 Case 2: 112233445566778899 + 998877665544332211 = 1111111111111111110
     


     

    Author
    Ignatius.L
     


     

    这道题的题意很明显就是实现大数相加,所以是高精度类题目。

    不过刚开始做这类题目还是要小心一些东西,例如开始输入的 时候小的小标里存放的却是大的数位,所以要反向赋值给两个整型数组(方便后面的处理),还有要注意最好不要用长度长的数字作为循环的控制条件,因为有时我们无法知道进位会进到第几位(即使知道处理起来也是比较麻烦的 ),所以是需要用最大的数字作为循环控制变量。其他的就是注意此题的输出要求比较高,要小心一些空格和回车。

    #include<stdio.h>
    #include<iostream>
    #include<string.h>
    using namespace std;
    char str1[1010];
    char str2[1010];
    int a[1010];
    int b[1010];
    int c[1010];
    int main()
    {
        int t;
        scanf("%d",&t);
        for(int i=1;i<=t;i++)
        {
           memset(a,0,sizeof(a));
           memset(b,0,sizeof(b));
           memset(c,0,sizeof(c));
           scanf("%s",str1);
           scanf("%s",str2);
           int len1,len2;
           len1=strlen(str1);
           len2=strlen(str2);
           //输入的数字最小下标的数位最大,所以要反向赋值到a[],b[] 
           int cx=0;
           for(int j=len1-1;j>=0;j--)
           a[cx++]=str1[j]-48;
           cx=0;
           for(int j=len2-1;j>=0;j--)
           b[cx++]=str2[j]-48;
           int plus=0;
           for(int j=0;j<1002;j++)
           {
                  int s;
                  s=a[j]+b[j]+plus;
                  c[j]=s%10;
                  plus=s/10;
              
           }
           printf("Case %d:\n",i);
           printf("%s + %s = ",str1,str2);
           int j;
           for(j=1001;j>=0;j--) if(c[j]) break;
           int rec;
           rec=j;
           if(rec<0){printf("0\n");printf("\n");continue;}//以防输出的结果是0 
           for(j=rec;j>=0;j--)
           printf("%d",c[j]);
           printf("\n");
           if(i!=t)
           printf("\n");
        }
        system("pause");
        return 0;
    }
    


     

  • 相关阅读:
    HDU 5492 Find a path
    codeforce gym 100548H The Problem to Make You Happy
    Topcoder SRM 144 Lottery
    codeforce 165E Compatible Numbers
    codeforce gym 100307H Hack Protection
    区间DP总结
    UESTC 1321 柱爷的恋爱 (区间DP)
    HDU 4283 You Are the One (区间DP)
    HDU 2476 String painter (区间DP)
    UESTC 426 Food Delivery (区间DP)
  • 原文地址:https://www.cnblogs.com/gremount/p/5768020.html
Copyright © 2011-2022 走看看