大数加法

 

    所谓大数问题,既是高精度数问题。在C语言中,小数点后的位数是有限的,对于整数部分也有int和long long 的限制,这就导致当我们在求几十位甚至上百位的数字数,无法直接得到程序设计要求的精度。

 

    对此现象,一个比较合理的解决办法既是建立数组对数据求解。

    代码如下:

#include <stdio.h>
#include <stdlib.h>
#define SIZE 105
int main()
{
    char input[SIZE];
    int sum[SIZE];
    memset(sum,0,sizeof(sum));
    int i , j , c ;
    while(1)
    {
        scanf("%s",input);
        if(strcmp(input,"0")==0)
        break;
        i = (j = strlen(input)) - 1;
        for(;i>=0;i--)
        {
            sum[j-i-1]+=input[i]-'0';
            if(sum[j-i-1]>=10)
            {
                sum[j-i-1] %= 10;
                sum[j-i]++;
            }
        }
    }
    c = 99;
        while(!sum[c])
        c--;
        for(;c>=0;c--)
        printf("%d",sum[c]);

        printf("\n");
    return 0;
}


    我们首先,设定一个char型的数组Input,注意这里一定是char型,因为如果是int的话我们是无法正确读入一个很长数位的数的。

    sum用来逆序保存结果,之所以逆序,是因为如果顺序存储,当最高位产生进位时,不方便保存这个进位。(事实上,你也可以顺序存储,比如从第1位开始,第0位存放进位,但是当两个数位相差很大的数相加时又不方便调控,所以最方便的应该还是逆序存储,这样更具灵活性)

    对于sum,首先置零,在每次对sum[i]进行存储时,必须进行的操作:

   如果sum[i]<10,则在这一位上没有进位,无需额外操作;反之,有进位的情况下,假设前面每一步都处理得当,则此时的进位最多为一位(与阶乘的高精度数区别),此时,需要向i的高位,即第i+1位加1,对第i位进行模10操作。

    需要注意的是,在sum[j-i-1]+=input[i]-'0';这一语句中,我们不可忘记-'0',因为在char型中,每个数都是以ASCII码的形式存储。

    最后,当得到一个结果时,想要输出他,按照习惯,我们需要去掉最高位及其进位以前的零,这里也体现了逆序存储的优势,while循环即可实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值