微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

nyoj大数加法

水题。需要注意的就是这里不能直接从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 = ",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;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐