N!
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 54233 Accepted Submission(s): 15395
Problem Description
Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!
Input
One N in one line, process to the end of file.
Output
For each N, output N! in one line.
Sample Input
1 2 3
Sample Output
1 2 6
思路:这道题就是按照数学思想来写的,只不过具体化为以位为单位。
代码:
第一种:
//这种方法比较费时,后有优化的;
#include<stdio.h>
#include<string.h>
#define M 50000
int a[M];
int main()
{
int n;
while(~scanf("%d",&n))
{
int i,j,c;
memset(a,0,sizeof(a));
if(n==0)
{
printf("1\n");
continue;
}
c=0;
a[1]=1;
for(i=1;i<=n;i++)
{
for(j=1;j<M;j++)
{
a[j]=a[j]*i+c;
c=a[j]/10;
a[j]=a[j]%10;
}
}
for(i=M;a[i]==0;i--);
for(;i>=1;i--)
printf("%d",a[i]);
printf("\n");
}
return 0;
}
第二种:
#include<string.h>
#define M 50000
int a[M];
int main()
{
int n;
while(~scanf("%d",&n))
{
int i,j,c;
memset(a,0,sizeof(a));
if(n==0)
{
printf("1\n");
continue;
}
c=0;
a[1]=1;
for(i=1;i<=n;i++)
{
for(j=1;j<M;j++)
{
a[j]=a[j]*i+c;
c=a[j]/10;
a[j]=a[j]%10;
}
}
for(i=M;a[i]==0;i--);
for(;i>=1;i--)
printf("%d",a[i]);
printf("\n");
}
return 0;
}
第二种:
#include<stdio.h>
#include<string.h>
#define M 50000
int a[M];
int main()
{
int n;
while(~scanf("%d",&n))
{
int i,j,c,k;
memset(a,0,sizeof(a));
if(n==0)
{
printf("1\n");
continue;
}
int bit=1;
a[0]=1;
c=0;
for(i=1;i<=n;i++)
{
for(j=0;j<bit;j++)
{
a[j]=a[j]*i+c;
c=a[j]/10;
a[j]=a[j]%10;
}
while(c)
{
a[bit]+=c%10;
c=c/10;
bit++;
}//区别主要在这:这个是当有必要进位时才进位,前者则不是;
}
for(i=bit;a[i]==0;i--);
for(;i>=0;i--)
{
printf("%d",a[i]);
}
printf("\n");
}
return 0;
}
#include<string.h>
#define M 50000
int a[M];
int main()
{
int n;
while(~scanf("%d",&n))
{
int i,j,c,k;
memset(a,0,sizeof(a));
if(n==0)
{
printf("1\n");
continue;
}
int bit=1;
a[0]=1;
c=0;
for(i=1;i<=n;i++)
{
for(j=0;j<bit;j++)
{
a[j]=a[j]*i+c;
c=a[j]/10;
a[j]=a[j]%10;
}
while(c)
{
a[bit]+=c%10;
c=c/10;
bit++;
}//区别主要在这:这个是当有必要进位时才进位,前者则不是;
}
for(i=bit;a[i]==0;i--);
for(;i>=0;i--)
{
printf("%d",a[i]);
}
printf("\n");
}
return 0;
}