
题意很好理解,就是计算过程中可能超出int 的范围,现在就来解决这个问题。
王道机试指南给出的解法是采用一个digit[1000]数组存储每四位的值,例如10001这个数,在数组里面存放的方式就是digit[0]=1,digit[1]=1;这样就能把那些大数存储下来了。话不多说看代码
#include<stdio.h>
struct bigInt
{
int digit[1000];
int size;
void init()
{
for(int i=0;i<1000;i++)
digit[i]=0;
size=0;
}
void set(int x)//用一个小整数设置高精度整数
{
init();
do
{
digit[size++]=x%10000;
x/=10000;
}while(x!=0);
}
void output()
{
for(int i=size-1;i>=0;i--)
{
if(i!=size-1)
printf("%04d",digit[i]);
else
printf("%d",digit[i]);
}
}
bigInt operator *(int x)const
{
bigInt ret;
ret.init();
int carry=0;
for(int i=0;i<size;i++)
{
int temp=x*digit[i]+carry;
carry=temp/10000;
temp=temp%10000;
ret.digit[ret.size++]=temp;
}
if(carry!=0)
ret.digit[ret.size++]=carry;
return ret;
}
}a;
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
a.init();
a.set(1);
for(int i=1;i<=n;i++)
a=a*i;
a.output();
}
return 0;
}
其他类似的大精度整数都可以这样计算,希望下次见到我会做呵呵
网友评论