求改错啊,不知道错在哪了http:⼀⼀acm.hdu.edu.cn⼀showproblem.php?pid=1042

2024-11-22 03:07:29
推荐回答(3个)
回答1:

你的数组开太小了,10000的时候有35000多位。还有你的运行效率也不行。

下面的代码是我的,我用了进制优化
#include
#include
#include
typedef __int64 lld;
const lld UP=100000000;
const lld MAX=4500;
lld ret[MAX],len;
void multi(lld ret[],lld n)
{
lld i;
for(i=0;i<=len;i++)
ret[i]*=n;
for(i=0;i<=len;i++)
{
ret[i+1]+=ret[i]/UP;
ret[i]%=UP;
}
if(ret[len+1])
{
while(ret[len+1])
{
len++;
ret[len+1]+=ret[len]/UP;
ret[len]%=UP;
}
}
}
int main()
{
lld i,n,t,f,x,o;
while(scanf("%I64d",&n)!=EOF)
{
memset(ret,0,sizeof(ret));
ret[0]=1;
len=0;
f=t=0;
for(i=1;i<=n;i++)
{
/*x=i;
while(x%2==0)
{
t++;
x/=2;
}
while(x%5==0)
{
x/=5;
f++;
}
if(x>1)*/
multi(ret,i);
}
/*if(f o=f;
else
o=t;
t-=f;
if(t<0)
{
t=-t;
while(t--)
multi(ret,5);
}
else
{
while(t--)
multi(ret,2);
}*/
printf("%I64d",ret[len]);
for(i=len-1;i>=0;i--)
printf("%08I64d",ret[i]);
//while(o--)
// printf("0");
puts("");
}
return 0;
}

回答2:

int ans[10000], len;
void mul(int k)
{
int i, t = 0;
for(i=0; i {
t = ans[i]*k+t;
ans[i] = t%10000;
t /= 10000;
}
if(t)
{
ans[i] = t;
++len;
}
}
void main()
{
int i, n;
while(scanf("%d",&n)!=EOF)
{
ans[0] = len = 1;
for(i=2; i<=n; i++)
mul(i);
printf("%d", ans[len-1]);
for(i=len-2; i>-1; i--)
printf(",%04d", ans[i]);
putchar('\n');
}
}

回答3:

10000的阶乘有三万五千多位,你的数组太小,还有你的算法不可取,肯定超时