问题描述
本题要求实现一个打印非负整数阶乘的函数。
函数接口定义:
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
内存限制
64 MB
解析
这道题没有独立写出来,参考了B站上某位大佬的思路,茅塞顿开。
1000的阶乘是一个天文数字,int甚至long long都是远远无法表示的。运用一个数组将结果的每一位数字依次存放在数组里。每次乘一个新的数,都从结果数组的最后一位(下标为0)开始往前依次单独与该数相乘,相乘的结果的个位留在原来的位置中,其余的值进位到前一位数。
while(sum)
{
a[length++]=sum%10;
sum/=10;
}
以上部分代码用于扩充结果数组的长度。
代码
void Print_Factorial ( const int N )
{
if(N<0)
{
printf("Invalid input\n");
return;
}
if(N==0||N==1)
{
printf("1\n");
return;
}
int a[10000];
for(int i=1;i<1000;i++) a[1000]=0;
a[0]=1;
int length=1;
for(int i=2;i<=N;i++)
{
int sum=0;
for(int j=0;j<length;j++)
{
int temp=i*a[j]+sum;
a[j]=temp%10;
sum=temp/10;
}
while(sum)
{
a[length++]=sum%10;
sum/=10;
}
}
for(int i=length-1;i>=0;i--) printf("%d",a[i]);
}