Time Limit : 10000/5000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 56 Accepted Submission(s) : 22
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
Input
Output
Sample Input
Sample Output
Author
很显然是个大数问题,,阶乘这东西整个是几何增加。另外里边n《10000,所以用来处理的数组每一位不存一位了,一位存储10000,但是
又要考虑到输出问题,如果这个得到的是1,输出应该是0001,因为你一个位就代表了0~9999 用d 输出
C代码:
#include<stdio.h>
#define MAX 10000 //定义一个大非常大的常量MAX,为了防止溢出
int nj[MAX];//定义一个足够大的数组来存放当前i的阶乘的值,并以每个数组元素不超过100000的大小,用多个数组元素存放。。。
int main()
{
int i,j,n,s,t;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<MAX;i++)//把数组元素全赋值为了0
nj[i]=0;
nj[0]=1;//对其0的阶乘赋初值为1
for(i=2;i<=n;i++)
{ s=0;
for(j=0;j<MAX;j++)
{
t=nj[j]*i+s;//给J下标对应的累积求i的阶乘,当其超过100000位的时候,取其商加至下标为j+1的数中。。
s=t/100000;///取出超过100000位的整数部分
nj[j]=t%100000;//对其当前的j下标的数组值取余,作为下个数i的阶乘的尾数。
}
}
for(i=MAX-1;i>=0;i--)
if(nj[i])//对数组NJ值的判断来找出答案的位置。。直至i下标不为0的数组元素值为止,并跳出找下标的循环。。
break;
printf("%d",nj[i]);//对其最后一位不用输出占5位
for(j=i-1;j>=0;j--)
printf("%05d",nj[j]);// 输出时占5位,不足补0;
printf("\n");
}
return 0;
}
C++代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
const int maxn=50000;
int f[maxn];
int main()
{
int i,j,n;
while(scanf("%d",&n)==1)
{
memset(f,0,sizeof(f));
f[0]=1;
for(i=2;i<=n;i++)
{
int c=0;
for(j=0;j<maxn;j++)
{
int s=f[j]*i+c;
f[j]=s%100000;
c=s/100000;
}
}
for(j=maxn-1;j>=0;j--)
if(f[j])
break;
printf ("%d" , f[j]) ;
for(i=j-1;i>=0;i--)
printf("%05d",f[i]);
printf("\n");
}
return 0;
}