Go语言实现Irreducible Sum of Rationals

描述

You will have a list of rationals in the form
lst = [ [numer_1, denom_1] , … , [numer_n, denom_n] ]
or
lst = [ (numer_1, denom_1) , … , (numer_n, denom_n) ]
where all numbers are positive integers. You have to produce their sum N / D in an irreducible form: this means that N and D have only 1 as a common divisor.

分析

方法1:实现分数加法与约分。
分数加法即: a 1 b 1 + a 2 b 2 = a 1 × b 2 + a 2 × b 1 b 1 × b 2 \frac{a1}{b1}+\frac{a2}{b2}=\frac{a1 \times b2+a2 \times b1}{b1 \times b2} b1a1+b2a2=b1×b2a1×b2+a2×b1
分数约分即: a b = a / gcd ⁡ ( a , b ) b / gcd ⁡ ( a , b ) \frac{a}{b}=\frac{a/\gcd(a, b)}{b/\gcd(a, b)} ba=b/gcd(a,b)a/gcd(a,b)
方法2:利用go语言math/big库的分数运算。

实现

方法1:

import "fmt"

func gcd(a, b int) int {
  for a % b != 0 { a, b = b, a % b }
  return b
}

func fracAdd(a, b []int) []int {
  d := a[1] * b[1]
  c := a[0] * b[1] + b[0] * a[1]
  g := gcd(c, d)
  return []int{ c / g, d / g }
}

func SumFracts(arr [][]int) string {
  if len(arr) == 0 { return "0" }
  r := arr[0]
  for i := 1; i < len(arr); i++ {
    r = fracAdd(r, arr[i])
  }
  if r[1] == 1 { return fmt.Sprintf("%d", r[0]) }
  return fmt.Sprintf("%d/%d", r[0], r[1])
}

方法2:

import "math/big"

func SumFracts(arr [][]int) string {
  result := new(big.Rat).SetFloat64(0)
  for _, v := range(arr) {
    rat := big.NewRat(int64(v[0]), int64(v[1]))
    result.Add(result, rat)
  }
  return result.RatString()
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值