原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1042
分析:大数的题目,模拟乘法,我这里把个位数放在最后面的位置。。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define Max 10000
#define Mod 10000
int ans[Max+1];
int main()
{
int n;
while(~scanf("%d",&n))
{
if(n==0)
{
printf("1\n");
continue;
}
memset(ans,0,sizeof(ans));
ans[Max]=n;
int i,R;
for(i=n-1;i>=2;i--)
{
R=0;
for(int j=Max;j>=0;j--)
{
R=ans[j]*i+R;
ans[j]=R%Mod;
R/=Mod;
}
}
for(i=0;i<=Max;i++) if(ans[i])
{
printf("%d",ans[i]);
//printf("i=%d\n",i);
break;
}
// printf("\n%d\n",i);
// system("pause");
for(i+=1;i<=Max;i++)
{
printf("%04d",ans[i]);
}
puts("");
}
return 0;
}
总结:一开始还是WA了..TAT.一直以为是组数开的太小,最后发现是没有考虑n=0时的情况。
Java代码:
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int n;
BigInteger ans;
Scanner in = new Scanner(System.in);
while(in.hasNext())
{
n=in.nextInt();
ans=BigInteger.valueOf(1);
while(n>=2)
{
ans=ans.multiply(BigInteger.valueOf(n));
n-=1;
}
System.out.println(ans);
}
}
}
总结:吸取了用C写实的教训,处理了n=0时的情况