本篇将继续讲解PTA平台上的题目 L1-009 N个数求和,通过对一组有理数(分子/分母形式)的求和操作,进一步提升Cangjie编程语言的数组处理、数学运算与最大公约数化简能力。
关键词
- PTA刷题
- 有理数操作
- 分数化简
- 循环求和
- Cangjie语言
一、L1-009 N个数求和
题目描述:给定一个正整数 N,随后给出 N 个有理数(分子/分母形式)。要求输出这些有理数的和,结果以最简形式表示,分数部分应满足分子小于分母且分子和分母互质。
-
输入格式:
- 首先输入一个正整数 N,表示有理数的数量。
- 接着在一行内以 a1/b1 a2/b2 … 格式输入 N 个有理数。
-
输出格式:输出上述数字和的最简形式。如果结果为带分数,则输出整数部分和分数部分;如果结果为纯分数,输出分数部分;如果结果为整数,则仅输出整数部分。
解题思路
- 有理数加法:对分子/分母形式的有理数进行加法运算,累加求和,求出总分数的分子和分母。
- 最大公约数化简:通过最大公约数(GCD)将结果化简,确保输出的分子和分母互质。
- 结果格式化输出:将结果转化为带分数或整数,根据题目要求进行格式化输出。
代码实现
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
}
代码详解
- 最大公约数计算:使用递归函数 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/thread?topicId=175
來源:坚果派
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。