user-0 提问: hdoj-1002 A+B problemII 不明白哪里错了（WA）

回复:
user: user-1
content: 只改动2个地方是不够的。请试以下输入：  1 9 9  #2程序输出： Case 1: 9 + 9 = 8

user: user-0
content: O(∩_∩)O谢谢你的耐心分析，不过只需要改动2个地方即可------>  #include<stdio.h> #include<string.h> #define N 1005   int common(int a, int b){     if(a<b){         return a;     }     else{         return b;     } } int rest(int a, int b){     int temp;     if(b>a){         temp = b;          b = a;         a = temp;     }     return (a-b-1); } int main() {     char num1[N], num2[N], sum1[N], sum2[N]; // num存储输入的数,sum存储结果      int n;           while(scanf("%d", &n)!=EOF){ // n为要输入的行数                int k, i = 0, add=0;               for(; i<n; i++){                           if(i){ // Output a blank line between two test cases.                 printf("\n");             }                           scanf("%s%s", num1, num2);                           int len1 = strlen(num1); // 计算两个输入数的位数              int len2 = strlen(num2);                           int long1 = len1-1, long2 = len2-1; // 对应的下标                        if( len1 >= len2 ){                 k = long2;                 for(; k>=0; k--){                     sum2[k] = (num1[long1]-'0') + (num2[long2]-'0')+add;                     if(sum2[k]>=10){                         sum2[k] -= 10;                         add = ((num1[long1]-'0' )+ (num2[long2]-'0')+add)/10;                     }                     else{              //改动一                         add = 0;                     }                     long1--;                     long2--;                 }                 k = len1-len2-1;                 for(; k>=0; k--){                     sum1[k] = (num1[k]-'0')+add;                     if(sum1[k]>=10 && k>0){                         sum1[k] -= 10;                         add = ((num1[k]-'0')+add)/10;                     }                      else{                         add = 0;                     }                 }             }             else{                 k = long1;                 for(; k>=0; k--){                     sum2[k] = (num1[long1]-'0') + (num2[long2]-'0')+add;                     if(sum2[k]>=10){                         sum2[k] -= 10;                         add = ((num1[long1]-'0' )+ (num2[long2]-'0')+add)/10;                     }                     else{              //改动二                         add = 0;                     }                      long1--;                     long2--;                 }                 k = len2-len1-1;                 for(; k>=0; k--){                     sum1[k] = (num2[k]-'0')+add;                     if(sum1[k]>=10 && k>0){                         sum1[k] -= 10;                         add = ((num2[k]-'0')+add)/10;                     }                      else{                         add = 0;                     }                 }             }             int lenSum1 = rest(len1, len2);             int lenSum2 = common(len1, len2);             printf("Case %d:\n", i+1);             printf("%s + %s = ", num1, num2);             k = 0;             for(; k<=lenSum1; k++){                 printf("%d", sum1[k]);             }             k = 0;             for(; k<lenSum2; k++){                 printf("%d", sum2[k]);             }             printf("\n");         }     }     return 0; }

user: user-1
content: LZ程序中的问题是： 1 没有在每个用例开始处把变量add清零 2 计算过程中没有进位时没有把变量add清零 3 输出时没有输出尚未使用的进位值  如下修改可AC：  #include<stdio.h> #include<string.h> #define N 1005  int common(int a, int b){   if(a<b){     return a;   }   else{     return b;   } } int rest(int a, int b){   int temp;   if(b>a){     temp = b;      b = a;     a = temp;   }   return (a-b-1); } int main() {   char num1[N], num2[N], sum1[N], sum2[N]; // num存储输入的数,sum存储结果    int n;    scanf("%d", &n); //改 while(scanf("%d", &n)!=EOF){ // n为要输入的行数       int k, i = 0, add=0;      for(; i<n; i++){       if(i){ // Output a blank line between two test cases.         printf("\n");       }        scanf("%s%s", num1, num2);        int len1 = strlen(num1); // 计算两个输入数的位数        int len2 = strlen(num2);        int long1 = len1-1, long2 = len2-1; // 对应的下标         add=0; //加       if( len1 >= len2 ){         k = long2;         for(; k>=0; k--){           sum2[k] = (num1[long1]-'0') + (num2[long2]-'0')+add;           if(sum2[k]>=10){             sum2[k] -= 10;             add = ((num1[long1]-'0' )+ (num2[long2]-'0')+add)/10;           }            else{             add = 0; //加           }           long1--;           long2--;         }         k = len1-len2-1;         for(; k>=0; k--){           sum1[k] = (num1[k]-'0')+add;           if(sum1[k]>=10 && k>0){             sum1[k] -= 10;             add = ((num1[k]-'0')+add)/10;           }            else{             add = 0;           }         }       }       else{         k = long1;         for(; k>=0; k--){           sum2[k] = (num1[long1]-'0') + (num2[long2]-'0')+add;           if(sum2[k]>=10){             sum2[k] -= 10;             add = ((num1[long1]-'0' )+ (num2[long2]-'0')+add)/10;           }            else{             add = 0; //加           }           long1--;           long2--;         }         k = len2-len1-1;         for(; k>=0; k--){           sum1[k] = (num2[k]-'0')+add;           if(sum1[k]>=10 && k>0){             sum1[k] -= 10;             add = ((num2[k]-'0')+add)/10;           }            else{             add = 0;           }         }       }       int lenSum1 = rest(len1, len2);       int lenSum2 = common(len1, len2);       printf("Case %d:\n", i+1);       printf("%s + %s = ", num1, num2);       if (add) printf("%d", add); //加       k = 0;       for(; k<=lenSum1; k++){         printf("%d", sum1[k]);       }       k = 0;       for(; k<lenSum2; k++){         printf("%d", sum2[k]);       }       printf("\n");     }   //删 }   return 0; }