本题要求实现一个打印非负整数阶乘的函数。
函数接口定义:
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_s("%d", &N);
Print_Factorial(N);
getchar();
getchar();
return 0;
}
/* 你的代码将被嵌在这里 */
void Print_Factorial(const int N)
{
int i;
int sum=1;
if (N >= 0&&N<=12)
{
if (N == 0)
sum = 1;
else
for (i = 1; i <= N; i++)
sum = sum*i;
printf("%d\n", sum);
}
else if (N > 12 && N <= 1000)
{
int num[3000] = { 0 }; //用于存储最终结果数据
int k = 1; //位数
int n = 0; //进位
int i, j, x, temp;
num[0] = 1; //结果初始化1
for (i = 2; i <= N; i++) //从2开始阶乘 数据结果逆序存放
{
for (j = 0; j < k; j++) //将临时结果的每一位与阶乘数值相乘
{
temp = num[j] * i + n; // 每一位分别作阶乘
num[j] = temp % 10; //更新末位数值
n = temp / 10; //更新进位数值
}
while (n != 0)
{
num[k] = n % 10; //更新进位数据
n /= 10;
k++; //更新进位位数
}
}
for (x = k - 1; x >= 0; x--) //数据输出
printf("%d", num[x]);
}
else
printf("Invalid input");
}
这个题目提交了好多次,开始以为是基础的阶乘题目,但是提交后发现永远是部分正确,只得15分,起初以为是输出printf函数的问题,修改后还是部分正确,最终查找了几个CSDN博客才找到源码,水平较渣,源码看了好久才看明白。
这个问题中,由于1000!大约有3000位数值,所以只能通过构造数组的形式来实现对结果的存储。
int 型占在32位上位机上占据32个字节,所以最大值时2的32次方=4294967296(无符号),带符号再除以2,负数比正数多一个,便得出取值范围-2147483648~+2147483647。又由于13!=6 227 020 800,已经超出了最大值,所以在计算13以后的阶乘时采用数组方式解决问题。