PS:我也不知道为什么无聊写了这篇博客,有需要的可以看一看。(完整程序在最后)
利用计算机进行数值计算,有时会遇见这样的问题:有些计算要求精度高,希望计算的数的位数可达上百位。虽说计算机本身精度已经很高了,但是因为受到硬件的限制,往往达不到实际问题所要求的精度。我们可以设计出程序去实现这样的高精度算法去解决这样的问题。在这里分析一下高精度加法。
高精度加法的程序可以分为以下几个步骤:
一.先定义两个字符数组和三个整型数组,如:
char n1[205],n1[205];
int a[205],b[205],c[205];
为什么是三个呢???
因为我们用数组c输出最终结果。
思路就是:c[i]=a[i]+b[i]+x;
当然,还有进位,我们用x代替。
二.将整型数组“清零”:
1.定义全局变量;
2.用函数“清零”:
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
三.输入,取长度:
gets(n1);int lena=strlen(n1);
gets(n2);int lenb=strlen(n2);
四.将它们(整型数组)转换类型逆序储存:
for(int i=0;i<lena;i++)
a[lena-i]=a1[i]-'0';
for(int i=0;i<lenb;i++)
b[lenb-i]=b1[i]-'0';
五.定义lenc=1(位数),x=0(进位(其实在两个加数的加法中,x只会为1或0)),该计算了:
while(lenc<=lena||lenc<=lenb)
{
c[lenc]=a[lenc]+b[lenc]+x;
x=c[lenc]/10;
c[lenc]%=10;
lenc++;
}
当然,还要考虑更高一位的x,也就是进位,那么只要把x的值给现在的c[lenc]就行了:
c[lenc]=x;
六.lenc是我们用来计算结果位数的,但现在lenc并不在结果的最高位,那么我们可以用如下方法去除前导“0”:
while(c[lenc]==0&&lenc>1)
{
lenc--;
}
解释:只要c[lenc]为0并且不是最后一位,就把lenc--,直到找到结果最高位为止。
七.经过这么多步骤,终于可以输出了:
for(int i=lenc;i>=1;i--)
{
printf("%d",c[i]);
}
好吧,不知道你是否明白了?如果还是没有明白,那就去看书吧!
最后附上完整的程序:
#include<cstdio>
#include<cstring>
int main()
{
char a1[205],b1[205];
int a[205],b[205],c[205],lena,lenb,lenc=1,x=0;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
gets(a1);
gets(b1);
lena=strlen(a1);
lenb=strlen(b1);
for(int i=0;i<lena;i++)
a[lena-i]=a1[i]-'0';
for(int i=0;i<lenb;i++)
b[lenb-i]=b1[i]-'0';
while(lenc<=lena||lenc<=lenb)
{
c[lenc]=a[lenc]+b[lenc]+x;
x=c[lenc]/10;
c[lenc]%=10;
lenc++;
}
c[lenc]=x;
while(c[lenc]==0&&lenc>1)
{
lenc--;
}
for(int i=lenc;i>=1;i--)
{
printf("%d",c[i]);
}
return 0;
}