软文发布门户网站,凡科做公司网站怎么收费,艺术品交易网站开发,定制网站建设开发文章目录 题目函数接口定义裁判测试程序样例输入样例输出样例 题解解题思路完整代码AC代码 编程练习题目集目录
题目 要求实现一个打印非负整数阶乘的函数。
函数接口定义 void Print_Factorial ( const int N ); 其中N是用户传入的参数#xff0c;其值不超过 1000 1000 10… 文章目录 题目函数接口定义裁判测试程序样例输入样例输出样例 题解解题思路完整代码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.hvoid 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*90180位100-999相乘最多有3*9002700位1000是4*14位总计2893最好数组取大一下int i, j, k, n;k 1; // 位数n 0; // 进位Num[0] 1; // 将结果先初始化为1int 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; // 新加一位添加信息。位数增1k;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*90180位100-999相乘最多有3*9002700位1000是4*14位总计2893最好数组取大一下int i, j, k, n;k 1; // 位数n 0; // 进位Num[0] 1; // 将结果先初始化为1int 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; // 新加一位添加信息。位数增1k;n n / 10; // 看还能不能进位}}for (i k - 1; i 0; i--){printf(%d, Num[i]);}printf(\n);}
}