题目链接:
6-10 阶乘计算升级版 - 基础编程题目集 (pintia.cn)
题目:
6-10 阶乘计算升级版
分数 20
本题要求实现一个打印非负整数阶乘的函数。
函数接口定义:
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
代码:
void Print_Factorial(const int N)
{
if (N < 0)
{
printf("Invalid input");
}
else
{
int num[2600] = { 0 };//阶乘的结果可能大于int类型,所以需要创建一个数组来储存结果的每位上的数
int i = 1;
int j = 0;
int count = 0;
num[0] = 1;
int digit = 1;//用来储存结果有几位数
for (i = 2; i <= N; i++)
{
//每位数字的储存和更新:
for (j = 0; j < digit; j++)
{
int t = i * num[j] + count;
num[j] = t % 10;
count = t / 10;
}
//若原来的位数不够储存结果:
while (count)
{
num[j++] = count % 10;
count /= 10;
digit++;
}
}
//将每位数字都打印出来:
for (int j = digit - 1; j >= 0; j--)
{
printf("%d", num[j]);
}
}
}
代码讲解:
阶乘的结果可能大于INT_MAX的值,会导致数据泄漏,所以我们需要想办法解决这个问题。
在这里我采用了数组的形式来储存结果的每一位数,以N=5举例: