PAT乙 1034 有理数四则运算 (GO实现)

解题:

  1. 本题没有什么难的点,看着有点吓人,感觉是代码量比较大。
  2. 最初用GO写的时候,用bufio读入字符串,发现中间转换起来会非常耗时,期间一直有一个测试点一直超时,最初还以为是分子相乘时导致超过范围引起的,还特意写过一个大数相乘崩溃!!
  3. 而且代码比较长,后来参考了一篇大神写的代码,给了我很大的启发,其实并不需要用字符串读入,按照正常的fmt.Scanf("%d/%d %d/%d")读入int即可,不要考虑太复杂。
  4. 重新梳理一遍后,就是正常的"+","-","*","/",可以先把简单的4中情况写完,再去考虑特殊情况,比如分子或分母为0的情况。
  5. 当然求最大公约数是必须的
package main

import (
	"fmt"
)

func gcdx(x, y int) int {
	var tmp int
	for {
		tmp = x % y
		if tmp > 0 {
			x = y
			y = tmp
		} else {
			return y
		}
	}
}

func formatPrint(a, b int) {
	if b == 0 {
		fmt.Print("Inf")
		return
	}
	inegative := 1
	if a < 0 {
		a *= -1
		inegative *= -1
	}
	if b < 0 {
		b *= -1
		inegative *= -1
	}
	gcdd := gcdx(a, b)
	a /= gcdd
	b /= gcdd
	if inegative == -1 {
		fmt.Printf("(-")
	}

	k := a / b
	f := a % b
	if k > 0 && f > 0 {
		fmt.Printf("%d %d/%d", k, f, b)
	} else if k == 0 && f > 0 {
		fmt.Printf("%d/%d",f, b)
	} else {
		fmt.Printf("%d", k)
	}

	if inegative == -1 {
		fmt.Printf(")")
	}
}

func  main() {
	var a1, b1, a2, b2 int
	_, _ = fmt.Scanf("%d/%d %d/%d", &a1, &b1, &a2, &b2)
	var op = [4]byte{'+', '-', '*', '/'}

	for i:=0; i<4; i++ {
		formatPrint(a1,b1)
		fmt.Printf(" %c ", op[i])
		formatPrint(a2,b2)
		fmt.Printf(" = ")
		switch op[i] {
		case '+':
			formatPrint(a1 * b2 + a2 * b1, b1 * b2)
			break
		case '-':
			formatPrint(a1 * b2 - a2 * b1, b1 * b2)
			break
		case '*':
			formatPrint(a1 * a2, b1 * b2)
			break
		case '/':
			formatPrint(a1 * b2, b1 * a2)
		}
		fmt.Println()
	}
}

参考自:https://www.jianshu.com/p/0ac1c4d5dfda

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值