「Mac玩转仓颉内测版18」PTA刷题篇9 - L1-009 N个数求和
2024-11-17 21:19:18
12次阅读
0个评论
最后修改时间:2024-11-18 20:07:56
本篇将继续讲解PTA平台上的题目 L1-009 N个数求和,通过对一组有理数(分子/分母形式)的求和操作,进一步提升Cangjie编程语言的数组处理、数学运算与最大公约数化简能力。
关键词
- PTA刷题
- 有理数操作
- 分数化简
- 循环求和
- Cangjie语言
一、L1-009 N个数求和
题目描述:给定一个正整数 N,随后给出 N 个有理数(分子/分母形式)。要求输出这些有理数的和,结果以最简形式表示,分数部分应满足分子小于分母且分子和分母互质。
-
输入格式:
- 首先输入一个正整数 N,表示有理数的数量。
- 接着在一行内以 a1/b1 a2/b2 ... 格式输入 N 个有理数。
-
输出格式:输出上述数字和的最简形式。如果结果为带分数,则输出整数部分和分数部分;如果结果为纯分数,输出分数部分;如果结果为整数,则仅输出整数部分。
解题思路
- 有理数加法:对分子/分母形式的有理数进行加法运算,累加求和,求出总分数的分子和分母。
- 最大公约数化简:通过最大公约数(GCD)将结果化简,确保输出的分子和分母互质。
- 结果格式化输出:将结果转化为带分数或整数,根据题目要求进行格式化输出。
代码实现
package cjcDemo
import 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 = 0
var denominator = 1
// 遍历每个分数,累加到总分子/分母
for (fraction in fractions) {
numerator = numerator * fraction[1] + fraction[0] * denominator
denominator *= fraction[1]
// 化简每次的分数
let (simplifiedNumerator, simplifiedDenominator) = simplify(numerator, denominator)
numerator = simplifiedNumerator
denominator = simplifiedDenominator
}
return (numerator, denominator)
}
main(): Int64 {
// 读取输入的 N
let 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 / totalDenominator
let remainderNumerator = totalNumerator % totalDenominator
if (integerPart != 0 && remainderNumerator != 0) {
// 带分数的输出
println("${integerPart} ${abs(remainderNumerator)}/${totalDenominator}")
} else if (remainderNumerator == 0) {
// 结果为整数
println("${integerPart}")
} else {
// 纯分数的输出
println("${remainderNumerator}/${totalDenominator}")
}
return 0
}
代码详解
- 最大公约数计算:使用递归函数 gcd 计算两个数的最大公约数,用于化简分子和分母。
- 累加分数:通过将所有分数转化为公分母形式后进行累加,累加的结果存储在分子和分母中。
- 化简分数:每次累加后,调用 simplify 函数,确保累加后的分数以最简形式表示。
- 输出处理:根据分子和分母的结果输出整数部分和分数部分,或仅输出整数,确保符合题目要求。
示例执行
示例 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 來源:坚果派 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
00
- 0回答
- 1粉丝
- 0关注
相关话题
- 「Mac玩转仓颉内测版10」PTA刷题篇1 - L1-001 Hello World
- 「Mac玩转仓颉内测版11」PTA刷题篇2 - L1-002 打印沙漏
- 「Mac玩转仓颉内测版15」PTA刷题篇6 - L1-006 连续因子
- 「Mac玩转仓颉内测版16」PTA刷题篇7 - L1-007 念数字
- 「Mac玩转仓颉内测版14」PTA刷题篇5 - L1-005 考试座位号
- 「Mac玩转仓颉内测版19」PTA刷题篇10 - L1-010 比较大小
- 「Mac玩转仓颉内测版20」PTA刷题篇11 - L1-011 A-B
- 「Mac玩转仓颉内测版12」PTA刷题篇3 - L1-003 个位数统计
- 「Mac玩转仓颉内测版13」PTA刷题篇4 - L1-004 计算摄氏温度
- 「Mac玩转仓颉内测版17」PTA刷题篇8 - L1-008 求整数段和
- 「Mac玩转仓颉内测版9」入门篇9 - 综合案例篇
- 「Mac玩转仓颉内测版1」入门篇1 - Cangjie环境的搭建
- 「Mac玩转仓颉内测版21」基础篇1 - 仓颉程序的基本组成
- 「Mac玩转仓颉内测版4」入门篇4 - Cangjie变量命名规则
- 「Mac玩转仓颉内测版5」入门篇5 - Cangjie控制结构(上)