您的位置:首页 > 其它

大数加法

2012-07-18 08:48 134 查看
 

    所谓大数问题,既是高精度数问题。在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循环即可实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  input 存储 c 语言