本题要求实现一个打印非负整数阶乘的函数。
函数接口定义:
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
高精度阶乘基本思路是利用数组。
高精度乘法在 计算时需要数组的每一个单元都乘一遍,而且在进位时位数的增加不可以放在循环内部
代码实现:
void Print_Factorial ( const int N )
{
int a[1000]={0};
//先判断特殊情况
if(N<0)
{
printf("Invalid input");
}
else
{
//先初始化,乘法单元是1
int j=0;
a[0]=1;
//开始高精度阶乘
for(int i=2;i<=N;i++)
{
//记住每一个数组单元都要乘
for(int k=0;k<=j;k++)
{
a[k]*=i;
}
//进位
for(int k=0;k<=j;k++)
{
if(a[k]>=1000)
{
a[k+1]+=a[k]/1000;
a[k]%=1000;
}
}
位数增加
if(a[j+1]>0)j++;
}
//打印
printf("%d",a[j--]);
for(int k=j;k>=0;k--)
{
printf("%03d",a[k]);
}
}
}