7 高精度计算
注:由于高精度计算的算法和竖式计算类似,故在此不再提供算法描述,直接提供源代码.
7.1 加法
[源程序]
void Add(char s1[256], char s2[256], char Ans[256])
{
chara[256],b[256];
inti,Len,Len1,Len2,k;
for(i=0;i<=255;i++)
{
a[i]=0;
b[i]=0;
Ans[i]=0;
}
Len1=strlen(s1);
Len2=strlen(s2);
if(Len1>Len2) Len=Len1;
elseLen=Len2;
k=0;
for(i=Len1-1;i>=0;i--) a[++k]=s1[i]-'0';
k=0;
for(i=Len2-1;i>=0;i--) b[++k]=s2[i]-'0';
for(i=1;i<=Len;i++)
{
a[i]=a[i]+b[i];
if (a[i]>=10)
{
a[i]=a[i]-10;
a[i+1]++;
}
}
if(a[Len+1]==0) Len--;
k=0;
for(i=Len+1;i>=1;i--) Ans[k++]=a[i]+'0';
}
7.2 减法
[源程序]
void Sub(char s1[256], char s2[256], char Ans[256])
{
chara[256],b[256];
inti,Len,Len1,Len2,k;
for(i=0;i<=255;i++)
{
a[i]=0;
b[i]=0;
Ans[i]=0;
}
Len1=strlen(s1);
Len2=strlen(s2);
if(Len1>Len2) Len=Len1;
elseLen=Len2;
k=0;
for(i=Len1-1;i>=0;i--) a[++k]=s1[i]-'0';
k=0;
for(i=Len2-1;i>=0;i--) b[++k]=s2[i]-'0';
for(i=1;i<=Len;i++)
if (a[i]<b[i])
{
a[i+1]--;
a[i]=a[i]+10;
a[i]=a[i]-b[i];
}
else a[i]=a[i]-b[i];
while(a[Len]==0 && Len>1) Len--;
k=0;
for(i=Len;i>=1;i--) Ans[k++]=a[i]+'0';
}
7.3 乘法
[源程序]
void Mul(char s1[256], char s2[256], char Ans[256])
{
chara[256],b[256],c[256];
intLen1,Len2,Len,k,x,y,z,i,j,w;
for(i=0;i<=255;i++)
{
a[i]=0;
b[i]=0;
c[i]=0;
Ans[i]=0;
}
Len1=strlen(s1);
Len2=strlen(s2);
Len=Len1+Len2;
k=0;
for(i=Len1-1;i>=0;i--) a[++k]=s1[i]-'0';
k=0;
for(i=Len2-1;i>=0;i--) b[++k]=s2[i]-'0';
for(i=1;i<=Len1;i++)
for (j=1;j<=Len2;j++)
{
x=a[i]*b[j];
y=x/10;
z=x%10;
w=i+j-1;
c[w]=c[w]+z;
c[w+1]=c[w+1]+c[w]/10+y;
c[w]=c[w]%10;
}
while(c[Len]==0 && Len>1) Len--;
k=0;
for(i=Len;i>=1;i--) Ans[k++]=c[i]+'0';
}