nyoj 大数加法

来源:互联网 发布:知乎经济思想史 编辑:程序博客网 时间:2024/05/23 21:04
水题。需要注意的就是这里不能直接从a0,b0开始加,因为他们如果位数不一样就会发生错乱,如123+6789,如果直接从1、6开始加,和阶乘一样,那么就错了,因为位不对应了。所以必须先把a和b逆序存入另两个字符串,变成321+9876,然后从第0位开始挨着加就行了,最后也是逆序输出。


#include
#include
int main()
{
    int t, i, cou = 0, k, j,c[1005], jin, s, la, lb;
    char a[1005], b[1005],a1[1005], b1[1005];
    scanf("%d",&t);
    while(t--)
    {
       cou++;
       scanf("%s %s", a1, b1);
       printf("Case %d:\n", cou);
       printf("%s + %s = ", a1, b1);
       la = strlen(a1);
       lb = strlen(b1);
       for(i = 0 , j = la - 1 ; i < la ; i++, j--)//逆序存入
           a[j] =a1[i];
       a[la] = '\0';
       for(i = 0 , j = lb - 1 ; i < lb ; i++,j--)
           b[j] =b1[i];
       b[lb] = '\0';
       jin = 0;
       for(i = 0 ; a[i] != '\0' && b[i] != '\0'; i++)
       {
           s = a[i] +b[i] - 96 + jin;
           c[i] = s %10;
           jin =s/10;
       }
       j = i; //这里如果漏了。。那么位数一样的就输出不出来了,因为j没赋值。
       if(a[i] != '\0') //处理a与b不对应的位上的数字和,即多余位
       {
           for(j = i; a[j] != '\0' ; j++)
           {
              s = a[j] + jin - 48;
              c[j] = s % 10;
              jin = s / 10;
           }

       }
       else if(b[i] != '\0')
       {
           for(j = i; b[j] != '\0' ; j++)
           {
              s = b[j] + jin - 48;
              c[j] = s % 10;
              jin = s / 10;
           }

       }
       k = j - 1;
       if(jin)  //别忘了处理最后的进位
       {
           c[j] =jin;
           k =j;
       }
       for(; k >= 0 ; k--)
          printf("%d", c[k]);
       printf("\n");
    }
    return 0;
}

0 0
原创粉丝点击