当前位置: 首页 > news >正文

函数题 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 212 之间则可以直接相乘,输出即可;如果大于 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;             // 将结果先初始化为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*90=180位,100-999相乘最多有3*900=2700位,1000是4*1=4位,总计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");}
}
http://www.lryc.cn/news/444567.html

相关文章:

  • java项目之基于springboot的医院资源管理系统源码
  • Docker命令全解析:掌握容器化技术的基石
  • 2024.9.19
  • “跨链桥“的危害
  • GO CronGin
  • 手机在网状态查询接口如何用C#进行调用?
  • Java面向对象特性与泛型:深入理解与应用
  • Qwen2.5 本地部署的实战教程
  • Oracle数据库pl/sql显式抛出异常
  • Undet for sketchup 2023.3注册机 支持草图大师sketchup2021-2022-2023
  • Java详细学习路线:从入门到精通的全方位指南
  • Spark 性能优化高频面试题及答案
  • 【洛谷】AT_abc371_e [ABC371E] I Hate Sigma Problems 的题解
  • 【Go】Go 环境下载与安装教程(Windows系统)
  • 毕业设计选题:基于springboot+vue+uniapp的驾校报名小程序
  • 网页通知设计灵感:CSS 和 JS 的 8 大创意实现
  • 计算机毕业设计之:基于微信小程序的中药材科普系统(源码+文档+讲解)
  • C++速通LeetCode中等第6题-找到字符串中所有字母异位词(滑动窗口最详细代码注释)
  • Tcping:一款实用的端口存活检测工具
  • 【每日刷题】Day130
  • 书生·浦语作业集合
  • 得物App科技创新“再上一层楼”,荣获国家级奖项
  • C#软键盘设计字母数字按键处理相关事件函数
  • C++笔记---set和map
  • HTTP 教程
  • 低代码革命:加速云原生时代的端到端产品创新
  • 力扣 92.反转链表Ⅱ
  • 2024年最新版TypeScript学习笔记——泛型、接口、枚举、自定义类型等知识点
  • java项目之城镇保障性住房管理系统(源码+文档)
  • 无人机之航线规划篇