From 2c55167dd026da4fbeb5f3216ee5eecb232b6280 Mon Sep 17 00:00:00 2001 From: Celestino Amoroso Date: Thu, 2 May 2024 11:04:20 +0200 Subject: [PATCH] operator-fraction.go: the constructor newFraction() does call simplifyIntegers() on the num e den --- operator-fraction.go | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/operator-fraction.go b/operator-fraction.go index 6119179..86d9357 100644 --- a/operator-fraction.go +++ b/operator-fraction.go @@ -16,10 +16,11 @@ type fraction struct { } func newFraction(num, den int64) *fraction { - if den < 0 { + /* if den < 0 { den = -den num = -num - } + }*/ + num, den = simplifyIntegers(num, den) return &fraction{num, den} } @@ -145,12 +146,12 @@ func lcm(a, b int64) (l int64) { func sumFract(f1, f2 *fraction) (sum *fraction) { m := lcm(f1.den, f2.den) - sum = &fraction{f1.num*(m/f1.den) + f2.num*(m/f2.den), m} + sum = newFraction(f1.num*(m/f1.den) + f2.num*(m/f2.den), m) return } func mulFract(f1, f2 *fraction) (prod *fraction) { - prod = &fraction{f1.num * f2.num, f1.den * f2.den} + prod = newFraction(f1.num * f2.num, f1.den * f2.den) return } @@ -239,23 +240,30 @@ func divAnyFract(af1, af2 any) (quot any, err error) { return } -func simplifyFraction(f *fraction) any { - return simplifyIntegers(f.num, f.den) +func simplifyFraction(f *fraction) (v any) { + f.num, f.den = simplifyIntegers(f.num, f.den) + if f.den == 1 { + v = f.num + } else { + v = &fraction{f.num, f.den} + } + return v } -func simplifyIntegers(num, den int64) (v any) { +func simplifyIntegers(num, den int64) (a, b int64) { + if num == 0 { + return 0, 1 + } + if den == 0 { + panic("fraction with denominator == 0") + } if den < 0 { den = -den num = -num } g := gcd(num, den) - num = num / g - den = den / g - if den == 1 { - v = num - } else { - v = &fraction{num, den} - } + a = num / g + b = den / g return }