高精度計算是NOIP中常考常用的算法之一,剛才把我們班康運澤同學寫的高精度乘法要了過來,改成了完全的封裝函數,貼了出來。
代碼如下:
#include<fstream>
using namespace std;
ifstream fin("mul.in");
ofstream fout("mul.out");
int e[220]={5};
int gjdcf(char *mul,char *mul2)
{
int i,j,lq,lw,q[110],w[110],temp;
lq=strlen(mul);
for (i=0;i<lq;i++)
{
q[lq-1-i]=mul[i]-'0';
}
lw=strlen(mul2);
for (i=0;i<lw;i++)
{
w[lw-1-i]=mul2[i]-'0';
}
if (lq<lw)
{
for (i=0;i<lw;i++)
{
temp=q[i];
q[i]=w[i];
w[i]=temp;
}
temp=lq;
lq=lw;
lw=temp;
}
for (i=0;i<(lq+lw+1);i++)
{
e[i]=0;
}
for (i=0;i<lw;i++)
{
for (j=0;j<lq;j++)
{
if ((e[j+i-1]>=10)&&((j+i-1)>=0))
{
e[j+i]=e[j+i]+e[j+i-1]/10;
e[j+i-1]=e[j+i-1]%10;
}
if ((w[i]*q[j])<10)
{
e[j+i]=(w[i]*q[j])+e[j+i];
}
if ((w[i]*q[j])>=10)
{
e[j+i+1]=(w[i]*q[j])/10+e[j+i+1];
e[j+i]=(w[i]*q[j])%10+e[j+i];
}
if ((e[j+i])>=10)
{
e[j+i+1]=e[j+i]/10+e[j+i+1];
e[j+i]=e[j+i]%10;
}
}
}
return lq+lw;
}
void print(int p)
{
int i;
if (e[p-2]==0)
{
fout<<0;
}
else
{
if ((e[p-1]==0)&&(e[p-2]!=0))
{
for (i=p-2;i>=0;i--)
{
fout<<e[i];
}
}
else
{
for (i=p-1;i>=0;i--)
{
fout<<e[i];
}
}
}
}
int main()
{
char aa[101],bb[101];
fin>>aa>>bb;
print(gjdcf(aa,bb));
return 0;
}