本题要求实现一个打印非负整数阶乘的函数。
函数接口定义:
void Print_Factorial ( const int N );
其中N
是用户传入的参数,其值不超过1000。如果N
是非负整数,则该函数必须在一行中打印出N
!的值,否则打印“Invalid input”。
裁判测试程序样例:
#include <stdio.h> void Print_Factorial ( const int N ); int main() { int N; scanf("%d", &N); Print_Factorial(N); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
15
输出样例:
1307674368000
代码长度限制
16 KB
时间限制
400 ms
内存限制
思路:首先我们知道,整数N的位数为lg(N)+1,由斯特林(stiring)公式转化,可知
#include <stdio.h>
#include <math.h>
#define PI 3.14159
#define e 2.718
int digit_stiriling(int n)
{
long long res=0.5*log10(2*PI*n)+n*log10(n/e)+1;
return res;
}
可以知道 n为1000时位数为2568,而long long的范围最大为10的18次方,所以应该可以通过竖式计算的原理,用算法模拟竖式计算。
void Print_Factorial ( const int N )
{
int n,carry=0,r=0,right=0,numble,i;
int num[99999];
num[0]=1;
if( N<0 ){
printf("Invalid input\n");
return ;
}
for( n=1; n<=N; n++){
for( r=0; r<=right; r++){
numble = num[r]*n+carry;
num[r] = numble%10;
carry =numble/10;
}
while( carry>0 ){
right++;
num[right] = carry%10;
carry /= 10;
}
}
for( i=right; i>=0; i--){
printf("%d",num[i]);
}
return ;
}