高精度问题,好几次超时,最后发现是重复计算了好多。
TLE代码:
#include <stdio.h>
#include <string.h>
#define MAX 50000
int f[MAX];
int main()
{
int i,j,n,c,s;
while(scanf("%d",&n)!=EOF){
memset(f,0,sizeof(f));
f[0]=1;
for(i=1;i<=n;i++){
c=0;
for(j=0;j<MAX;j++){
s=f[j]*i+c;
f[j]=s%10;
c=s/10;
}
}
for(j=MAX-1;j>=0;j--) if(f[j]) break;
for(i=j;i>=0;i--) printf("%d",f[i]);
printf("\n");
}
return 0;
}
AC代码:
#include <stdio.h>
#include <string.h>
#define MAX 50000
int f[MAX];
int main()
{
int i,j,n,c,s;
int flag;
while(scanf("%d",&n)!=EOF){
flag=1;
memset(f,0,sizeof(f));
f[0]=1;
for(i=1;i<=n;i++){
c=0;
for(j=0;j<flag;j++){
s=f[j]*i+c;
f[j]=s%10;
c=s/10;
}
while(c) //记录进位
{
f[flag++]=c%10;
c/=10;
}
}
for(j=MAX-1;j>=0;j--) if(f[j]) break;
for(i=j;i>=0;i--) printf("%d",f[i]);
printf("\n");
}
return 0;
}
用java秒过
import java.io.*;
import java.util.*;
import java.math.*;
public class Main
{
public static void main(String args[])
{
Scanner cin = new Scanner(System.in);
while(cin.hasNext()){
BigInteger ans=new BigInteger("1");
int n=cin.nextInt();
for(int i=1;i<=n;i++){
BigInteger b=BigInteger.valueOf(i);
ans=ans.multiply(b);
}
System.out.println(ans);
}
}
}