「Mac玩转仓颉内测版18」PTA刷题篇9 - L1-009 N个数求和

本篇将继续讲解PTA平台上的题目 L1-009 N个数求和,通过对一组有理数(分子/分母形式)的求和操作,进一步提升Cangjie编程语言的数组处理、数学运算与最大公约数化简能力。


关键词
  • PTA刷题
  • 有理数操作
  • 分数化简
  • 循环求和
  • Cangjie语言

一、L1-009 N个数求和

题目描述:给定一个正整数 N,随后给出 N 个有理数(分子/分母形式)。要求输出这些有理数的和,结果以最简形式表示,分数部分应满足分子小于分母且分子和分母互质。

  • 输入格式

    1. 首先输入一个正整数 N,表示有理数的数量。
    2. 接着在一行内以 a1/b1 a2/b2 … 格式输入 N 个有理数。
  • 输出格式:输出上述数字和的最简形式。如果结果为带分数,则输出整数部分和分数部分;如果结果为纯分数,输出分数部分;如果结果为整数,则仅输出整数部分。


解题思路
  1. 有理数加法:对分子/分母形式的有理数进行加法运算,累加求和,求出总分数的分子和分母。
  2. 最大公约数化简:通过最大公约数(GCD)将结果化简,确保输出的分子和分母互质。
  3. 结果格式化输出:将结果转化为带分数或整数,根据题目要求进行格式化输出。

代码实现
package cjcDemoimport std.console.*
import std.math.*
import std.convert.*
import std.collection.*// 计算最大公约数
func gcd(a: Int64, b: Int64): Int64 {if (b == 0) {return a} else {return gcd(b, a % b)}
}// 化简分数
func simplify(numerator: Int64, denominator: Int64): (Int64, Int64) {let commonDivisor = gcd(abs(numerator), abs(denominator))return (numerator / commonDivisor, denominator / commonDivisor)
}// 计算多个分数的和
func sumFractions(fractions: ArrayList<(Int64, Int64)>): (Int64, Int64) {var numerator = 0var denominator = 1// 遍历每个分数,累加到总分子/分母for (fraction in fractions) {numerator = numerator * fraction[1] + fraction[0] * denominatordenominator *= fraction[1]// 化简每次的分数let (simplifiedNumerator, simplifiedDenominator) = simplify(numerator, denominator)numerator = simplifiedNumeratordenominator = simplifiedDenominator}return (numerator, denominator)
}main(): Int64 {// 读取输入的 Nlet N = Int64.parse(Console.stdIn.readln().getOrThrow())// 读取 N 个分数,格式为 a1/b1 a2/b2 ...let fractionsInput = Console.stdIn.readln().getOrThrow().split(" ")let fractions = ArrayList<(Int64, Int64)>(N)// 解析每个分数并存储为 (分子, 分母) 元组for (fraction in fractionsInput) {let parts = fraction.split("/")let numerator = Int64.parse(parts[0])let denominator = Int64.parse(parts[1])fractions.append((numerator, denominator))}// 计算所有分数的和let (totalNumerator, totalDenominator) = sumFractions(fractions)// 处理输出格式let integerPart = totalNumerator / totalDenominatorlet remainderNumerator = totalNumerator % totalDenominatorif (integerPart != 0 && remainderNumerator != 0) {// 带分数的输出println("${integerPart} ${abs(remainderNumerator)}/${totalDenominator}")} else if (remainderNumerator == 0) {// 结果为整数println("${integerPart}")} else {// 纯分数的输出println("${remainderNumerator}/${totalDenominator}")}return 0
}

代码详解
  1. 最大公约数计算:使用递归函数 gcd 计算两个数的最大公约数,用于化简分子和分母。
  2. 累加分数:通过将所有分数转化为公分母形式后进行累加,累加的结果存储在分子和分母中。
  3. 化简分数:每次累加后,调用 simplify 函数,确保累加后的分数以最简形式表示。
  4. 输出处理:根据分子和分母的结果输出整数部分和分数部分,或仅输出整数,确保符合题目要求。

示例执行

示例 1
输入:

3
1/2 1/3 1/6

输出:

1

示例 2
输入:

2
2/3 4/5

输出:

1 7/15

示例 3
输入:

3
-1/2 1/2 1/3

输出:

1/3

示例 4
输入:

5
2/5 4/15 1/30 -2/60 8/3

输出:

3 1/3

小结

本篇通过实现 L1-009 N个数求和,提升了对有理数分数加法、最大公约数化简的操作能力。我们通过累加和化简的过程,将结果正确地输出为最简形式,并展示了如何处理整数和分数的不同输出格式。


下篇预告

下一篇将继续进行PTA刷题,讲解 L1-010 比较大小 的解题思路与实现,敬请期待 「Mac玩转仓颉内测版19」PTA刷题篇10 - L1-010 比较大小


上一篇: 「Mac玩转仓颉内测版17」PTA刷题篇8 - L1-008 求整数段和
下一篇: 「Mac玩转仓颉内测版19」PTA刷题篇10 - L1-010 比较大小

作者:SoraLuna
链接:https://www.nutpi.net/thread?topicId=175
來源:坚果派
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【linux】网络基础 ---- 数据链路层

用于两个设备(同一种数据链路节点)之间进行传递 数据链路层解决的问题是&#xff1a;直接相连的主机之间&#xff0c;进行数据交付 1. 认识以太网 "以太网" 不是一种具体的网络, 而是一种技术标准&#xff1a; 既包含了数据链路层的内容, 也包含了一些物理层的内容…

i春秋-FUZZ(python模板注入、base64编码命令执行)

练习平台地址 竞赛中心 题目描述 题目内容 很直接就是要fuzz参数 参数字典 dpaste/eH2Z1 (Plain Text) BP爆破参数 发现存在name参数 尝试sql注入 发现输入啥就回显啥&#xff0c;猜测是模板注入 测试是不是模板注入 虽然9*9没有被执行&#xff0c;但是config执行了&#…

另外一种缓冲式图片组件的用法

文章目录 1. 概念介绍2. 使用方法2.1 基本用法2.2 缓冲原理3. 示例代码4. 内容总结我们在上一章回中介绍了"FadeInImage组件"相关的内容,本章回中将介绍CachedNetworkImage组件.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回中介绍的CachedNetwo…

Java中的CAS

目录 一.问题提出 1.1解决思路-锁 1.2解决思路-无锁 二.什么是CAS 三.CAS的特点 四.ABA问题 4.1解决方案-AtomicStampedReference 4.2解决方案-AtomicMarkableReference 一.问题提出 如何保证 withdraw 取款方法的线程安全 public class Cas {public static void mai…

git push时报错! [rejected] master -> master (fetch first)error: ...

错误描述&#xff1a;在我向远程仓库push代码时&#xff0c;即执行 git push origin master命令时发生的错误。直接上错误截图。 错误截图 错误原因&#xff1a; 在网上查了许多资料&#xff0c;是因为Git仓库中已经有一部分代码&#xff0c;它不允许你直接把你的代码覆盖上去…

药房智控:中药实验管理的自动化

6系统测试 6.1概念和意义 测试的定义&#xff1a;程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为&#xff1a; 目的&#xff1a;发现程序的错误&#xff1b; 任务&#xff1a;通过在计算机上执行程序&#xff0c;暴露程序中潜在的错误。 另一个…

C语言实现数据结构之二叉树

文章目录 二叉树一. 树概念及结构1. 树的概念2. 树的相关概念3. 树的表示4. 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 二. 二叉树概念及结构1. 概念2. 特殊的二叉树3. 二叉树的性质4. 二叉树的存储结构 三.二叉树链式结构的实现1. 前置说明2. 二叉树…

SpringCloud篇(服务保护 - Sentinel)

目录 一、雪崩问题及解决方案 1. 雪崩问题 2. 解决方案 方案一&#xff1a;超时处理 方案二&#xff1a;仓壁模式 方案三&#xff1a;断路器模式 方案四&#xff1a;限流 3. 总结 二、服务保护技术对比 三、Sentinel介绍与安装 1. 初识Sentinel 2. Sentinel 优势 3…

MCU的时钟体系

stm32F4的时钟体系图 1MHZ 10^6 HZ 系统时钟频率是168MHZ;AHB1、AHB2、AHB3总线上的时钟频率是168MHz;APB1总线上的时钟频率为42MHz&#xff1b;APB2总线上的时钟频率为84MHz&#xff1b; stm32F4的时钟体系图 在system_stm32f4xx.c文件中查看APB1和APB2的预分频值到底是多少…

Redis设计与实现 学习笔记 第十八章 发布与订阅

第18到24章是本书第四部分&#xff1a;独立功能的实现。 Redis的发布与订阅功能由PUBLISH、SUBSCRIBE、PSUBSCRIBE等命令组成。 通过执行SUBSCRIBE命令&#xff0c;客户端可订阅一个或多个频道&#xff0c;从而成为这些频道的订阅者&#xff08;subscriber&#xff09;&#…

小程序-基于java+SpringBoot+Vue的驾校预约平台设计与实现

项目运行 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境&#xff1a;Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

python多版本管理 windows11 pyenv

前言 需要开发多个项目&#xff0c;但各个项目的版本不一致怎么办&#xff1f;python -m venv 只解决了依赖隔离问题&#xff0c;但venv本身并没有办法提供多个python版本。因此我们要引入pyenv来解决。 安装pyenv https://pyenv-win.github.io/pyenv-win/ 安装很简单&…

01.防火墙概述

防火墙概述 防火墙概述1. 防火墙的分类2. Linux 防火墙的基本认识3. netfilter 中五个勾子函数和报文流向 防火墙概述 防火墙&#xff08; FireWall &#xff09;&#xff1a;隔离功能&#xff0c;工作在网络或主机边缘&#xff0c;对进出网络或主机的数据包基于一定的 规则检…

Excel表格解析为QTableWidget

解析表格 头文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QAxObject> #include <QTableWidget> #include <QTableWidgetItem> #include <QDebug> #include <QSet> #include <QPoint> #include…

华为欧拉系统使用U盘制作引导安装华为欧拉操作系统

今天记录一下通过U盘来安装华为欧拉操作系统 华为欧拉操作系统是国产的一个类似于Centos的Linus系统 具体实现操作步骤&#xff1a; 先在官网下载欧拉系统镜像点击跳转到下载 准备好一个大于16g的U盘 &#xff0c;用于制作U盘启动 下载一个引导程序制作工具&#xff0c;我使用…

魔改log4j2的JsonLayout,支持自定义json格式日志

小伙伴们&#xff0c;你们好&#xff0c;我是老寇&#xff0c;我又回来辣&#xff0c;1个多月不见甚是想念啊&#xff01;&#xff01;&#xff01;跟我一起魔改源码吧 1.自定义json格式【PatternLayout】 大部分教程都是这个&#xff0c;因此&#xff0c;我就简单给个配置&a…

机器学习—学习曲线

学习曲线是帮助理解学习算法如何工作的一种方法&#xff0c;作为它所拥有的经验的函数。 绘制一个符合二阶模型的学习曲线&#xff0c;多项式或二次函数&#xff0c;画出交叉验证错误Jcv&#xff0c;以及Jtrain训练错误&#xff0c;所以在这个曲线中&#xff0c;横轴将是Mtrai…

在MATLAB中实现自适应滤波算法

自适应滤波算法是一种根据信号特性自动调整滤波参数的数字信号处理方法&#xff0c;其可以有效处理噪声干扰和信号畸变问题。在许多实时数据处理系统中&#xff0c;自适应滤波算法得到了广泛应用。在MATLAB中&#xff0c;可以使用多种方法实现自适应滤波算法。本文将介绍自适应…

【系统编程】实验7 消息队列

设计程序 使用消息队列实现两个进程之间的信息互通 snd.c #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/msg.h> #include <unistd.h>/*消息发送者 */// 消息结构体如下&#xff1a; …

ETH钱包地址如何获取 如何购买比特币

首先我们要先注册一个交易所 Gate.io&#xff08;推荐&#xff09;: 点我注册 1、注册很简单&#xff0c;通过手机号就可以进行注册了。 2、获取ETH钱包地址 注册好之后&#xff0c;如图所示&#xff0c;点击“统一账户” 3、通过搜索栏搜索ETH&#xff0c;如下图所示 4、点…