PTA 函数题(C语言)-- 阶乘计算升级版

题目title: 阶乘计算升级版       题目作者: 陈越 浙江大学

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

函数接口定义:

void Print_Factorial ( const int N );

其中N是用户传入的参数,其值不超过1000。如果N是非负整数,则该函数必须在一行中打印出N!的值,否则打印“Invalid input”。

裁判测试程序样例:

#include <stdio.h>int Factorial( const int N );int main()
{int N, NF;scanf("%d", &N);NF = Factorial(N);if (NF)  printf("%d! = %d\n", N, NF);else printf("Invalid input\n");return 0;
}/* 你的代码将被嵌在这里 */

输入样例:

15

输出样例:

1307674368000

思路:这道题目的最后一个测试点是一个坑,要通过最后一个测试点就不能用普通的int、long long去存放计算出来的阶乘了,因为会越界!

我们的思路是用一个数组F[N]来存放阶乘(这里数组长度最小设置为N=2568,这个长度是我试出来的刚好能通过最后一个测试点的最小数组长度,多写点也无所谓)。存放的结构是低位在前,即F[0]存放的是个位,依此类推。

计算阶乘的时候我们用外层循环让i从2迭代到N,每次迭代给F"乘以"i。

这里的这个给数组"乘以"一个数,是用里层循环完成的,就按照我们小学学过的整数带进位的乘法。遍历从F[0]到F[N-1],比如遍历到某个F[j],我们要做的运算下面3步:
(1)给F[j]乘以外层循环当前的i,在加上F[j]前一项进位过来的值carry,然后把结果赋值给F[j],即F[j]=F[j]*i+carry;
(2)计算出要进位给下一位F[j+1]的值,carry = F[j]/10;
(3)F[j]只保留个位数字,F[j] = F[j]%10。

当里层循环遍历完,就像相当于给当前的阶乘F"乘以"外层循环当前的i,

当外层循环迭代完,F就存储了我们想要的阶乘了,只不过存储的结构是低位在前。

最后,我们要找到数组最后一个不为0的元素,从这个元素开始倒序输出数组即可。

代码:

void Print_Factorial ( const int N ) {int i, j, carry = 0;int M = 2568, F[2568] = {1}; // 初始化一个长度为2568的数组,为什么是2568呢?因为刚好能通过最后一个测试点。比2568长,是可以的。if (N < 0) {printf("Invalid input");return;} else if (N == 0) {printf("1");return;} else if (N > 0) {for (i = 2; i <= N; i++) {     // 用数组F来存放每次迭代算出来的阶乘,存放时低位在前,即F[0]存放的是个位,依此类推。for (j = 0; j < M; j++) {  // 乘的时候,用for循环对数组F的每个元素进行处理,计算的原则就是带进位的乘法。F[j] = F[j]*i+carry;carry = F[j]/10;F[j] = F[j]%10;}}for (i = M-1; i >= 0; i--) {if (F[i] != 0) {break;}}for (j = i; j >= 0; j--) {printf("%d",F[j]);}return;} 
}
 更多PTA题目的的参考代码,可以在wx小程序里搜“PTA刷题助手”,或扫下面的二维码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/126948.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构和算法——用C语言实现所有图状结构及相关算法

文章目录 前言图的基本概念图的存储方式邻接矩阵邻接表十字链表临界多重表 图的遍历最小生成树普里姆算法&#xff08;Prim&#xff09;克鲁斯卡尔算法&#xff08;Kruskal&#xff09; 最短路径BFS求最短路径迪杰斯特拉算法&#xff08;Dijkstra&#xff09;弗洛伊德算法&…

chorme安装esay scholar及chrome 无法从该网站添加应用、扩展程序和用户脚本解决方案

问题描述 如题&#xff0c;博主想安装easy scholar用于查询论文的分区&#xff0c;结果安装了半天一直出现chrome 无法从该网站添加应用、扩展程序和用户脚本解决方案的问题。 解决方案 先从这个网址下载&#xff1a;https://www.easyscholar.cc/download 然后对下载好的文…

MFC网络通信-Udp服务端

目录 1、UI的布局 2、代码的实现&#xff1a; &#xff08;1&#xff09;、自定义的子类CServerSocket &#xff08;2&#xff09;、重写OnReceive事件 &#xff08;3&#xff09;、在CUdpServerDlg类中处理 &#xff08;4&#xff09;、在OnInitDialog函数中 &#xff0…

计算1到100的和

一、不好的写法 public static void main(String[] args) {int sum 0;int n 100;for (int i 1; i < n; i) {sum i;}System.out.println("sum" sum);}1.定义两个整型变量&#xff1b; 2.执行100次加法运算&#xff1b; 3.打印结果到控制台&#xff1b; 二、好…

图解Kafka高性能之谜(五)

高性能的多分区、冗余副本集群架构 高性能网络模型NIO 简单架构设计&#xff1a; 详细架构设计&#xff1a; 高性能的磁盘写技术 高性能的消息查找设计 索引文件定位使用跳表的设计 偏移量定位消息时使用稀疏索引&#xff1a; 高响应的磁盘拷贝技术 kafka采用sendFile()的…

Qwt QwtPolarPlot类使用

1.概述 QwtPolarPlot是Qwt库中用于绘制极坐标图的类。它继承自QwtPolarItemDict和QFrame类&#xff0c;并且可以作为QwtPlot控件的一部分使用。 以下是类的继承关系图&#xff1a; 2.常用方法 设置标签&#xff1a; void setTitle (const QString &)void setTitle (con…

ClickHouse Java多参UDF

一、环境版本 环境版本docker clickhouse22.3.10.22 docker pull clickhouse/clickhouse-server:22.3.10.22二、XML配置 2.1 配置文件 # 创建udf配置文件 vim /etc/clickhouse-server/demo_function.xml<functions><function><type>executable</type&…

美创科技位居IDC MarketScape:中国数据安全管理平台市场「领导者」类别

近日&#xff0c;IDC发布《IDC MarketScape: 中国数据安全管理平台2023年厂商评估》 报告&#xff0c;报告从交付、产品特性、创新能力、研发速度、客户满意度等多个维度对国内厂商进行全面评估。美创科技列为『领导者』类别&#xff01; ◼︎ 报告中&#xff0c;从关键战略指…

MFC网络编程-Udp客户端

目录 1、UI的设计&#xff1a; 2、代码的实现&#xff1a; &#xff08;1&#xff09;、重写CSocket虚函数OnReceive&#xff0c;并且传入对话框的指针 &#xff08;2&#xff09;、初始化SOCKET &#xff08;3&#xff09;、绑定本地IP和端口 &#xff08;4&#xff09;、…

Vue xlsx插件前端导出

一、安装 xlsx npm install --save xlsx file-saver二、具体使用整体代码 如果数据格式是这样就用下面的&#xff0c;直接把数据传到 XLSX.utils.json_to_sheet list: [ { name: John, age: 25 }, { name: Jane, age: 30 }, // ... ]<template><button click"ex…

RCU初学参考资料

参考资料&#xff1a; 1.预备知识&#xff1a;QSBR算法 b-tree-QSBR简介 QSBR是通过quiescent state来检测grace period。如果线程T在某时刻不再持有共享对象的引用&#xff0c;那么该线程T在此时就处于quiescent state。如果一个时间区间内&#xff0c;所有线程都曾处于quie…

kubectl详解

陈述式资源管理方法&#xff1a; 1.kubernetes 集群管理集群资源的唯一入口是通过相应的方法调用 apiserver 的接口 2.kubectl 是官方的CLI命令行工具&#xff0c;用于与 apiserver 进行通信&#xff0c;将用户在命令行输入的命令&#xff0c;组织并转化为 apiserver 能识别的信…

LabVIEW开发双目立体系统猪重估算

LabVIEW开发双目立体系统猪重估算 动物的活重是各种研究中的重要参考&#xff0c;例如动物生长&#xff0c;饲料转化率&#xff0c;健康状况和疾病发生。生长中的动物的体重为保持它们处于适当的营养和环境水平提供了一个有价值的参数或指标。动物的利润通常与收入和成本之间的…

LCD驱动程序——Framebuffer应用编程

1.LCD 操作原理 在 Linux 系统中通过 Framebuffer 驱动程序来控制 LCD。Frame 是帧的意思&#xff0c;buffer 是缓冲的意思&#xff0c;这意味着 Framebuffer 就是一块内存&#xff0c;里面保存着一帧图像。Framebuffer 中保存着一帧图像的每一个像素颜色值&#xff0c;假设 L…

程序环境和预处理

目录 1. 程序的翻译环境和执行环境 2. C语言程序的编译链接 2.1. 预处理 2.2. 编译 2.3. 汇编 2.4. 链接 3. 运行环境的简单介绍 4. 预定义符号介绍 5. 预处理指令 #define 5.1. #define定义标识符 5.2. #define定义宏 5.3. #define替换规则 6. 宏和函数的对比 1. …

由k8s升级慢引起的etcd性能不足的问题排查

一、基本介绍 最近etcd查看出现性能 curl --cacert /path/to/etcdctl-ca.crt --cert /path/to/etcdctl.crt --key /path/to/etcdctl.key https://:2379/metrics | grep etcd_disk_wal_fsync_duration_seconds_bucket 当集群规模突破过大时规模时,曾出现如下性能瓶颈问题: etc…

Vue 的异步组件

目录 1&#xff0c;异步组件介绍2&#xff0c;路由中使用3&#xff0c;组件中使用3.1&#xff0c;Vue2 语法3.2&#xff0c;Vue3 语法 1&#xff0c;异步组件介绍 在项目中&#xff0c;有的组件仅在需要时才会加载&#xff0c;这时就需要用到异步组件。 异步组件本质上是一个…

带你从0开始学习自动化框架Airtest

现在市面上做UI自动化的框架很多&#xff0c;包括我们常用的Web自动化框架Selenium&#xff0c;移动端自动化框架Appium。 虽然Selenium和Appium分属同源&#xff0c;而且API都有很多相同的地方&#xff0c;可以无损耗切换&#xff0c;但是还是需要引入不同的库&#xff0c;而…

Debug技巧-不启用前端访问后端

在日常开发中&#xff0c;我们经常会遇到各种问题需要调试&#xff0c;前后端都启动需要耗费一定的时间和内存&#xff0c;方便起见&#xff0c;可以直接用抓包数据访问后端&#xff0c;这里我们需要用到Postman或者ApiFox 抓包数据 在系统前台触发后端请求&#xff0c;在控制…

【MATLAB第81期】基于MATLAB的LSTM长短期记忆网络预测模型时间滞后解决思路(更新中)

【MATLAB第81期】基于MATLAB的LSTM长短期记忆网络预测模型时间滞后解决思路&#xff08;更新中&#xff09; 在LSTM预测过程中&#xff0c;极易出现时间滞后&#xff0c;类似于下图&#xff0c;与一个以上的样本点结果错位&#xff0c;产生滞后的效果。 在建模过程中&#xf…