大数相加

描述
求两个不超过200位的非负整数的和。
输入
有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。
输出
一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
样例输入
22222222222222222222
33333333333333333333
样例输出
55555555555555555555

 

思路:先移位再相加。即先将短的字符串扩充到于长的字符串相等,不足得地方补'0',再立个flag,当c[i+1]大于,10的时候,flag+1,c[i+1]-=10;再判断c[0],如果c[0]=='1',则直接输出字符串c,若c[0]=='0',则需要判断什么时候c[i]不为0,从不为0的地方输出字符串c,即puts(&c[i])(或puts(c+i)),若都为0,则直接输出0。

 

//字符串实现

 

#include <stdio.h>

#include <string.h>
char a[205],b[205],c[205];
int main()
{
    memset(a,0,sizeof(a));//这三个memset可要可不要
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    scanf("%s",a);
    scanf("%s",b);
    int l,la,lb,flag=0,i,j;
    la=strlen(a);
    lb=strlen(b);
    if(la>lb)//移位
    {
        for(i=la-1,j=lb-1;j>=0;i--,j--)
            b[i]=b[j];
        for(i=0;i<la-lb;i++)
            b[i]='0';
        l=la;
    }
    else
    {
        for(i=la-1,j=lb-1;i>=0;i--,j--)
            a[j]=a[i];
        for(i=0;i<lb-la;i++)
            a[i]='0';
        l=lb;
    }
    for(i=l-1;i>=0;i--)//相加
    {
        c[i+1]=a[i]+b[i]+flag-'0';
        if(c[i+1]>'9')
        {
            flag=1;
            c[i+1]-=10;
        }
        else flag=0;
    }
    if(flag==1)c[0]='1';
    else c[0]='0';
    if(flag==1)puts(c);//输出
    else if(flag==0)
    {
        for(i=0;i<=l;i++)//判断
        {
            if(c[i]!='0')
                break;
        }
        if(i==l+1)printf("0");//都为0,直接输出字符串c
        puts(c+i);
    }
    return 0;

}

//数组实现

 

 

#include <stdio.h>
#include <string.h>
char a1[205],a2[205];
int c1[205],c2[205],c3[205];
int main()
{
    int i,j=0,l1,l2,flag=0;
    scanf("%s%s",a1,a2);
    l1=strlen(a1),l2=strlen(a2);
    for(i=l1-1;i>=0;i--)
        c1[j++]=a1[i]-'0';
    j=0;
    for(i=l2-1;i>=0;i--)
        c2[j++]=a2[i]-'0';
    j=0;
    for(i=0;i<205;i++)
    {
        c1[i]+=c2[i];
        if(c1[i]>9)
        {
            c1[i]-=10;
            c1[i+1]++;
        }
    }
    for(i=204;i>=0;i--)
        c3[j++]=c1[i];
    for(i=0;i<205;i++)
    {
        if(c3[i]!=0)flag=1;
        if(flag==1)printf("%d",c3[i]);
    }
    if(flag==0)printf("0");
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值