C语言大数加法

当计算两个较大的数的和时,可能C语言中的类型诸如int,long,long long型都无法表示时,此时应该换一种思维,将数看成是字符串,采用字符数组的方法进行存储与运算。

同时,应该注意到字符数组的存储方式,在字符数组中,低位地址存放的是字符数组的高位,所以执行加法时,应该从数组下标大的地址开始加。

以下题为例:

Calculate the result of a+b
Line i: two integer a and b seperated by one space
Multiple cases, end with EOF
0<=a,b,(a+b)<=2 63-1
Line i: (a+b)
the corresponding result of a+b
可见格式 带空格和换行符的格式 带空格和换行符的格式说明
573247196999136902 1171874011383462059
2093017816426442939 1172643980007319715
2560745550527527105 3566574549894016800


Original Transformed 带空格和换行符的格式说明
1745121208382598961
3265661796433762654
6127320100421543905

代码如下:

其实本题用不到大数加法的知识,用%llu的格式就足以应对……

#include <stdio.h>
#include <string.h>
int main()
{
    char a[66],b[66],c[67];   //输入的两个数存放在数组a,b中,c为输出的结果,同时a,b的长度应尽量大些
    int a_length,b_length;    //a_length,b_length分别表示输入数字的长度
    int flag,i,j,k;           //flag为是否进位的标志
    int sum;
    while(scanf("%s %s",&a,&b)!=EOF){    //输入数据,以EOF为结束的标志
    a_length = strlen(a);
    b_length = strlen(b);
    k = 0;
    flag=0;
    for(i=a_length-1,j=b_length-1;i>=0&&j>=0;i--,j--)   //从数组的高位开始相加
    {
        sum = a[i]-'0'+b[j]-'0'+flag;          //将每个字符转换为数字相加,结果为数字,并判断是否进位
        if(sum>=10)
        {
            sum -= 10;
            flag = 1;
        }
        else flag=0;
        c[k] = sum+'0';                       //将结果转换为字符存储在c中
        k++;
    }
    while(i>=0)                              //当a或b某一个计算结束时,用循环处理剩下的
    {
        sum = a[i]-'0'+flag;
        if(sum>=10)
        {
            sum -= 10;
            flag = 1;
        }
        else flag=0;
        c[k] = sum+'0';
        i--;
        k++;
    }
    while(j>=0){
        sum = b[j]-'0'+flag;
        if(sum>=10)
        {
            sum -= 10;
            flag = 1;
        }
        else flag=0;
        c[k] =sum+'0';
        j--;
        k++;
    }
    if(flag)                        //如果最后还有进位,则将k变为1
        c[k] = 1+'0';
    else k--;                       //否则将k的值减1
    for(;k>=0;k--){
        printf("%c",c[k]);
    }
    printf("\n");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值