「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 个有理数(分子/分母形式)。要求输出这些有理数的和,结果以最简形式表示,分数部分应满足分子小于分母且分子和分母互质。

  • 输入格式

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


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

代码实现
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
}

代码详解
  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 來源:坚果派 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


收藏00

登录 后评论。没有帐号? 注册 一个。