大数A+B

很激动的奔来写这篇日志(虽然已经深更半夜) 想了有些时间 终于想出来这个大数加法的源码了 时间耦合度O(N)

跟其他代码一样 用的处理字符串的方法 不过不一样的是接受两数和的字符串我从尾部输入数据 避免了出现多出一位从头再处理一遍的状况 同时也是给两个字符串各一个下标变量 向前推进 自我感觉是比较高效率的代码(虽然因为半夜交的 运行时间不精确被加加嘲讽了一番→_→) 还是蛮兴奋的~~(另想吐槽分神的数据……说好的整数怎么能带前导0呢T^T害我WA了两次 差点有改代码的冲动……)

代码奉上:

#include 
#include 

int main()
{
    char a[1502],b[1502],k[1503];
    int i,j;
    int lena,lenb,x;
    while(~scanf("%s%s",a,b))
    {
        lena=strlen(a);
        lenb=strlen(b);
        k[1502]=0;
        for(i=lena-1,j=lenb-1;i+1&&j+1;i--,j--)
        {
            k[1502-(lena-i)]=a[i]+b[j]-'0';
            if(k[1502-lena+i+1]>'9')
            {
                k[1502-lena+i+1]='0'+k[1502-lena+i+1]-'9'-1;
                k[1502-lena+i]++;
            }
        }
        x=lena;
        if(i>=0)
        {
            for(;i+1;i--)
            {

                k[1502-lena+i]=a[i];
                if(k[1502-lena+i+1]>'9')
                {
                    k[1502-lena+i+1]='0'+k[1502-lena+i+1]-'9'-1;
                    k[1502-lena+i]++;
                }
            }
            x=lena;
        }else if(j>=0)
        {
            for(;j+1;j--)
            {

                k[1502-lenb+j]=b[j];
                if(k[1502-lenb+j+1]>'9')
                {
                    k[1502-lenb+j+1]='0'+k[1502-lenb+j+1]-'9'-1;
                    k[1502-lenb+j]++;
                }
            }
            x=lenb;
        }
        /*if(k[1502-x]>'9')
        {
            k[1502-x]='0'+k[1502-x]-'9'-1;
            x++;
            k[1502-x]='1';
        }可忽略 处理前导的代码*/
       while(k[1502-x]=='0') x--;
       printf("%s\n",k+1502-x);
    }

    return 0;
}
大数A+B_第1张图片

你可能感兴趣的:(水,大数模拟,ACM道路之数学的艺术,C,编程,大数,算法)