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 一开始我以为用long long型的数字就可以满足条件了,但是我编译器不通过,我就试了哈提交上去,但是答案显示wa . 虽然对于很大的数据不对,但是对于long型以内的数据还是满足的,所以还是先把代码贴上来,后面贴满足真正意义上的大数据的代码#include <stdio.h> long len(long num1,long num2) { long sum = 0 , sum_tmp = 1 , sum_two = 0; while(num1 != 0 && num2 != 0) { sum_two = (num1%10) + (num2%10); sum += sum_tmp*sum_two; sum_tmp *= 10; num1 /= 10; num2 /= 10; } if(num1 != 0) { while(num1 != 0) { sum_two = num1%10; sum += sum_tmp*sum_two; sum_tmp *= 10; num1 /= 10; } } else if(num2 != 0) { while(num2 != 0) { sum_two = num2%10; sum += sum_tmp*sum_two; sum_tmp *= 10; num2 /= 10; } } return sum; } int main() { long n , a , b ,sum = 0; int i ; scanf("%d",&n); for(i = 0 ; i < n ; i ++) { scanf("%lld%lld",&a,&b); sum = len(a,b); printf("case %d:\n",i+1); if(i != n-1) { printf("%lld+%lld=%lld\n\n",a,b,sum); } else if(i == n-1) printf("%lld+%lld=%lld\n",a,b,sum); } return 0 ; }
下面贴上真正意义上符合大数据加法的代码:
结果还是wa...好难过#include<stdio.h> #include<string.h> void reverse( char *s ) /*将字符串逆置*/ { int length; int i = 0; char temp; length = strlen( s ); while( i < length - i - 1 ) { temp = s[i]; s[i] = s[length - i - 1]; s[length - i - 1] = temp; i++; } } void AddBigNum( char* s1, char* s2, char* result ) { int len1 = strlen( s1 ); int len2 = strlen( s2 ); int acc = 0, temp, i; /*acc为进位标记*/ if( s1 == NULL || s2 == NULL || result == NULL ) { return; } reverse( s1 ); reverse( s2 ); for( i = 0; i < len1 && i < len2; i++ ) { temp = s1[i] - '0' + s2[i] - '0' + acc; /*计算每位的实际和*/ result[i] = temp % 10 + '0'; /*通过求余数来确定每位的最终值*/ if( temp >= 10 ) /*通过这个if..else..条件来判断是否有进位,并设置进位值*/ acc = 1; else acc = 0; } if( i < len1 ) /*两个加数位数不同*/ { for( ; i < len1; i++ ) { temp = s1[i] - '0' + acc; /*依旧要考虑进位,比如9999 + 1的情况*/ result[i] = temp % 10 + '0'; if( temp >= 10 ) acc = 1; else acc = 0; } } if( i < len2 ) { for( ; i < len2; i++ ) { temp = s2[i] - '0' + acc; result[i] = temp % 10 + '0'; if( temp >= 10 ) acc = 1; else acc = 0; } } if( acc == 1 ) /*考虑如:123 + 911 = 1034的情况,如果不增加这个条件会得到结果为034,进位被舍弃*/ result[i++] = '1'; result[i] = '\0'; reverse( result ); } void main() { char s1[1000] = {0}; char s2[1000] = {0}; char result[1002]; int n,i; scanf("%d",&n); for(i = 0 ; i < n ; i ++) { scanf("%s%s",s1,s2); printf("case %d:\n",i+1); printf("%s + %s = ",s1,s2); AddBigNum( s1, s2, result ); if(i != n-1) { printf( "%s\n\n", result ); } else if(i == n-1) printf( "%s\n", result ); } }