解析: 翻转数,测试数据的数可能很大,以下代码WA,可见对于acm如果不能保证程序决定正确,就绝对错误!
1 #include <stdio.h> 2 typedef long long llong; 3 static llong reverse(llong n); 4 5 int main() 6 { 7 int n; 8 llong a, b, sum; 9 scanf("%d", &n); 10 while(n--){ 11 scanf("%lld%lld", &a, &b); 12 a = reverse(a); 13 b = reverse(b); 14 sum = reverse(a + b); 15 printf("%lld\n", sum); 16 } 17 return 0; 18 } 19 static llong reverse(llong n) 20 { 21 int result = 0; 22 while(n > 0){ 23 result = result * 10 + n % 10; 24 n /= 10; 25 } 26 return result; 27 }
当然,我又AC代码:
1 #include <stdio.h> 2 #include <string.h> 3 4 #define N 5000 /*结果长度少于500的加法计算*/ 5 6 static char s1[N], s2[N]; /*避免命名冲突*/ 7 static char *p1, *p2; /*真正计算的数据范围*/ 8 9 static void large_add(void); 10 static void reserve(char *p); 11 /***********************************************************************/ 12 static void large_add(void) 13 { 14 /*默认p1与p2均指向要相加的正确的位置*/ 15 int i, t; 16 int l1 = strlen(p1) - 1; 17 int l2 = strlen(p2) - 1; 18 t = l2 - l1; 19 char *p = (l1 >= l2) ? (p1 - 1) : (p1 - 1 - t); 20 t = p1 - p; 21 for(i = 0; i < t; i++) 22 p[i] = '0'; 23 l1 = strlen(p) - 1; 24 t = l1 - l2; 25 for(i = l1; i - t >= 0; i--) 26 p[i] += p2[i - t] - '0'; 27 /*相加与进位要分割开来*/ 28 for(i = l1; i > 0; i--){ 29 if(p[i] > '9'){ 30 p[i] -= 10; 31 p[i-1]++; 32 } 33 } 34 if(*p == '0') 35 p++; 36 p1 = p; 37 } 38 /**********************************************************************/ 39 int main() 40 { 41 int n, i; 42 scanf("%d", &n); 43 p1 = &s1[N/2]; 44 p2 = &s2[N/2]; 45 while(n--){ 46 scanf("%s %s", p1, p2); 47 reserve(p1); 48 reserve(p2); 49 large_add(); 50 reserve(p1); 51 i = 0; 52 while(p1[i] == '0'){ 53 if(p1[1] == '\0') 54 break; 55 p1++; 56 } 57 printf("%s\n", p1); 58 } 59 return 0; 60 } 61 static void reserve(char *p) 62 { 63 int l = strlen(p), i; 64 char t; 65 for(i = 0; i < l / 2; i++){ 66 t = p[i]; 67 p[i] = p[l - i - 1]; 68 p[l - i - 1] = t; 69 } 70 }