#include<stdio.h>
#include<string.h>
#define MAX 10000
int a[MAX+10];
int main()
{
int n,j,g,jw=0;
while(scanf("%d",&n)!=EOF)
{
memset(a,0,sizeof(a));
a[0]=1;
for(int t=1;t<=n;t++)
{
for(int i=0;i<MAX;i++)
{
g=a[i];
a[i]=(g*t+jw)%10;
jw=(g*t+jw)/10;
}
}
for(j=MAX;j>=0&&a[j]==0;j--);
for(;j>=0;j--)
printf("%d",a[j]);
printf("\n");
}
return 0;
}
今天对hdu的1042进行了优化,和前面的代码相比,现在是用一个数组元素来存储
大数的四位,所以对于每一次做乘法的结果就需要对10000取模后,再存到数组中去。
优化后的代码在原理上与原来的代码没什么区别,但是耗时要少得多,而且内存也消耗少一些。
具体代码如下:
#include<stdio.h>
#include<string.h>
#define MAX 1000000
//using namespace std;
int a[MAX+10];
int main()
{
int n,j,g,jw=0;
while(scanf("%d",&n)!=EOF)
{
memset(a,0,sizeof(a));
a[0]=1;
int flag=1;
for(int t=1;t<=n;t++)
{
for(int i=0;i<flag;i++)
{
g=a[i];
a[i]=(g*t+jw)%10;
jw=(g*t+jw)/10;
}
while(jw)
{
a[flag++]=jw%10;
jw/=10;
}
}
for(j=flag-1;j>=0;j--)
printf("%d",a[j]);
printf("\n");
}
return 0;
}