我的大数相加模板

大数相加模板--C/C++版

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1000

char sum[MAX];

void change(char *p1,char *p2)//消除p2的前置零,比如:p2="0000120" 得出p1="120"
{
    int i,j;
    for(i=0;i<strlen(p2);i++)
    {
        if('0'!=p2[i])
        {
            break;
        }
    }
    if(i==strlen(p2))
    {
        p1[0]='0';
        p1[1]='\0';
    }
    else
    {
        j=0;
        for(i;i<strlen(p2);i++)
        {
            p1[j]=p2[i];
            j++;
        }
        p1[j]='\0';
    }



}

int getsum(char *a,char *b,int a_length,int b_length,int flag)
//flag等于0表示a_length==b_length   flag等于1表示a_length>b_length
{
    sum[a_length]='\0';
    int tag=a_length-1;
    sum[a_length]='\0';
    int i;
    int psw=0;//向高位进位状态
    int he;//同位和
    int a1;//a当前位对应的数字
    int b1;//b当前位对应的数字

    for(i=b_length-1;i>=0;i--)
    {
        a1=(int)(a[tag]-48);
        b1=(int)(b[i]-48);
        he=a1+b1+psw;//本位和加上低位来的进位
        psw=0;
        if(he>=10)
        {
            he=he-10;
            psw=1;
        }
        sum[tag]=(char)(he+48);
        tag--;

    }
    if(!flag)
    {
        return psw;
    }
    else
    {
        int j;
        for(j=tag;j>=0;j--)
        {
            a1=(int)(a[j]-48);
            he=a1+psw;
            psw=0;
            if(he>=10)
            {
                he=he-10;
                psw=1;
            }
            sum[j]=(char)(he+48);
        }
        return psw;

    }



}




int funsum(char *c,char *d)
{
    char a[MAX],b[MAX];
    change(a,c);//消除c的前置零
    change(b,d);

    //调试
    /*
    printf("a=");
    puts(a);
    printf("b=");
    puts(b);
    */

    int a_length=strlen(a);
    int b_length=strlen(b);
    int first;//两个数相加之后结果最高位的进位标志
    if(a_length==b_length)
    {
        first=getsum(a,b,a_length,b_length,0);
    }
    if(a_length>b_length)
    {
        first=getsum(a,b,a_length,b_length,1);
    }
    if(a_length<b_length)
    {
        first=getsum(b,a,b_length,a_length,1);
    }

    return first;
}


int main()
{
    char a[MAX],b[MAX];

    while(scanf("%s%s",a,b)!=EOF)
    {
        int flag=funsum(a,b);
        if(flag==1)
        {
            printf("1");
            puts(sum);
        }
        else
        {
            puts(sum);
        }


        getchar();
    }



    return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值