函数题 6-10 阶乘计算升级版【PAT】

文章目录

编程练习题目集目录

题目

要求实现一个打印非负整数阶乘的函数。

函数接口定义

void Print_Factorial ( const int N );

其中N是用户传入的参数,其值不超过 1000 1000 。如果 N N 是非负整数,则该函数必须在一行中打印出 N ! N! 的值,否则打印 “ I n v a l i d i n p u t ” “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

题解

解题思路

首先判断传入函数的数字是否小于 0 0 ,如果小于 0 0 ,则输出 “ I n v a l i d i n p u t ” “Invalid input” ;如果是 0 0 或者 1 1 则直接输出 1 1 即可;如果在 2 − 12 2-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"); } }
本文是转载文章,点击查看原文
如有侵权,请联系 lx@jishuguiji.net 删除。