函数题 6-10 阶乘计算升级版【PAT】
文章目录
- 题目
- 函数接口定义
- 裁判测试程序样例
- 输入样例
- 输出样例
- 题解
- 解题思路
- 完整代码
- AC代码
编程练习题目集目录
题目
要求实现一个打印非负整数阶乘的函数。
函数接口定义
void Print_Factorial ( const int N );
其中N是用户传入的参数,其值不超过 1000 1000 1000。如果 N N N 是非负整数,则该函数必须在一行中打印出 N ! N! N! 的值,否则打印 “ I n v a l i d i n p u t ” “Invalid input” “Invalidinput”。
裁判测试程序样例
#include <stdio.h>
void Print_Factorial(const int N);
int main()
{
int N;
scanf("%d", &N);
Print_Factorial(N);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例
15
输出样例
1307674368000
题解
解题思路
首先判断传入函数的数字是否小于 0 0 0,如果小于 0 0 0,则输出 “ I n v a l i d i n p u t ” “Invalid input” “Invalidinput”;如果是 0 0 0 或者 1 1 1 则直接输出 1 1 1 即可;如果在 2 − 12 2-12 2−12 之间则可以直接相乘,输出即可;如果大于 12 12 12 则变量无法保存数据,需要使用数组来保存,将结果以数组形式输出即可。
完整代码
#include <stdio.h>
void Print_Factorial ( const int N );
int main()
{
int N;
scanf("%d", &N);
Print_Factorial(N);
return 0;
}
/* 你的代码将被嵌在这里 */
void Print_Factorial(const int N)
{
if (N < 0)
{
printf("Invalid input\n");
}
else if (N < 2) // 0和1的阶层为1
{
printf("1\n");
}
else if (N > 1 && N < 13) // 12及之前都可以用long int型表达
{
int i = 2;
long int sum = 1;
for (i; i <= N; i++)
{
sum *= i;
}
printf("%ld\n", sum);
}
else
{
int Num[3000] = { 0 }; // 确保保存最终运算结果的数组足够大:1-9相乘最多有9位,10-99相乘最多有2*90=180位,100-999相乘最多有3*900=2700位,1000是4*1=4位,总计2893,最好数组取大一下
int i, j, k, n;
k = 1; // 位数
n = 0; // 进位
Num[0] = 1; // 将结果先初始化为1
int temp; // 阶乘的任一元素与临时结果的某位的乘积结果
for (i = 2; i <= N; i++)
{
for (j = 0; j < k; j++)
{
temp = Num[j] * i + n; // 相应阶乘中的一项与当前所得临时结果的某位相乘(加上进位)
Num[j] = temp % 10; // 更新临时结果的位上信息
n = temp / 10; // 看是否有进位
}
while (n) // 如果有进位
{
Num[k] = n % 10; // 新加一位,添加信息。位数增1
k++;
n = n / 10; // 看还能不能进位
}
}
for (i = k - 1; i >= 0; i--)
{
printf("%d", Num[i]);
}
printf("\n");
}
}
AC代码
void Print_Factorial(const int N)
{
if (N < 0)
{
printf("Invalid input\n");
}
else if (N < 2) // 0和1的阶层为1
{
printf("1\n");
}
else if (N > 1 && N < 13) // 12及之前都可以用long int型表达
{
int i = 2;
long int sum = 1;
for (i; i <= N; i++)
{
sum *= i;
}
printf("%ld\n", sum);
}
else
{
int Num[3000] = { 0 }; // 确保保存最终运算结果的数组足够大:1-9相乘最多有9位,10-99相乘最多有2*90=180位,100-999相乘最多有3*900=2700位,1000是4*1=4位,总计2893,最好数组取大一下
int i, j, k, n;
k = 1; // 位数
n = 0; // 进位
Num[0] = 1; // 将结果先初始化为1
int temp; // 阶乘的任一元素与临时结果的某位的乘积结果
for (i = 2; i <= N; i++)
{
for (j = 0; j < k; j++)
{
temp = Num[j] * i + n; // 相应阶乘中的一项与当前所得临时结果的某位相乘(加上进位)
Num[j] = temp % 10; // 更新临时结果的位上信息
n = temp / 10; // 看是否有进位
}
while (n) // 如果有进位
{
Num[k] = n % 10; // 新加一位,添加信息。位数增1
k++;
n = n / 10; // 看还能不能进位
}
}
for (i = k - 1; i >= 0; i--)
{
printf("%d", Num[i]);
}
printf("\n");
}
}