二、字符串(26)592. 分数加减运算

给定一个表示分数加减运算的字符串 expression ,你需要返回一个字符串形式的计算结果。 

这个结果应该是不可约分的分数,即最简分数。 如果最终结果是一个整数,例如 2,你需要将它转换成分数形式,其分母为 1。所以在上述例子中, 2 应该被转换为 2/1。

示例 1:

输入: expression = "-1/2+1/2"
输出: "0/1"
 示例 2:

输入: expression = "-1/2+1/2+1/3"
输出: "1/3"
示例 3:

输入: expression = "1/3-1/2"
输出: "-1/6"
 

提示:

输入和输出字符串只包含 '0' 到 '9' 的数字,以及 '/', '+' 和 '-'。 
输入和输出分数格式均为 ±分子/分母。如果输入的第一个分数或者输出的分数是正数,则 '+' 会被省略掉。
输入只包含合法的最简分数,每个分数的分子与分母的范围是  [1,10]。 如果分母是1,意味着这个分数实际上是一个整数。
输入的分数个数范围是 [1,10]。
最终结果的分子与分母保证是 32 位整数范围内的有效整数。

 

1.byte类型

byte类型是uint8的别名,表示一个字节,
2.rune类型

rune类型是Go语言中的一个基本类型,其实就是一个int32的别名,主要用于表示一个字符类型大于一个字节小于等于4个字节的情况下,特别是中文字符。

GO语言"unicode"包中"IsDigit"函数的用法及代码示例。

用法:

func IsDigit(r rune) bool

IsDigit 报告符文是否为十进制数字。

 

 

func fractionAddition(expression string) string {
    x, y := 0, 1//初始构造的第一个分数

    for i, n := 0, len(expression); i < n;{//遍历整个字符串
    //读取分子
        x1, sign := 0, 1// x1是下一个分数的分子, 默认为0,符号为正数
        if expression[i] == '-' || expression[i] == '+'{//如果当前字符是符号位
            if expression[i] == '-'{
                sign = -1
            }
            i++//进入下一个位置,为数字
        }
        //循环:"-1/2+176/2+1/3",读取一个分数的全部分子
        for i < n &&unicode.IsDigit(rune(expression[i])){
            x1 = x1 * 10 + int(expression[i] - '0')
            i++
        }
        x1 = sign * x1
        i++//跳过符号位

    //读取分母
        y1 := 0
        for i < n && unicode.IsDigit(rune(expression[i])){//读取全部分母数
            y1 = y1 * 10 + int(expression[i] - '0')
            i++
        }

        //更新算数和
        x = x * y1 + x1 * y
        y *= y1

    }
    //分子为0
    if x == 0{
        return "0/1"
    }
    //返回最大公因数
    g := gcd(abs(x), y)
    return fmt.Sprintf("%d/%d", x / g, y / g)
}

func gcd(a, b int) int{
    for a != 0{//2, 10
        a, b = b % a, a//0,2
    }
    return b
}
func abs(x int) int{
    if x < 0{
        return -x
    }
    return x
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是java实现假分数乘除运算的示例代码: 假分数类Fraction: ```java public class Fraction { private int numerator; // 分子 private int denominator; // 分母 // 构造函数 public Fraction(int numerator, int denominator) { if (denominator == 0) { throw new IllegalArgumentException("分母不能为0"); } int gcd = gcd(numerator, denominator); this.numerator = numerator / gcd; this.denominator = denominator / gcd; if (this.denominator < 0) { // 统一分母为正数 this.numerator = -this.numerator; this.denominator = -this.denominator; } } // 法 public Fraction add(Fraction f) { int newNumerator = this.numerator * f.denominator + this.denominator * f.numerator; int newDenominator = this.denominator * f.denominator; return new Fraction(newNumerator, newDenominator); } // 法 public Fraction subtract(Fraction f) { int newNumerator = this.numerator * f.denominator - this.denominator * f.numerator; int newDenominator = this.denominator * f.denominator; return new Fraction(newNumerator, newDenominator); } // 乘法 public Fraction multiply(Fraction f) { int newNumerator = this.numerator * f.numerator; int newDenominator = this.denominator * f.denominator; return new Fraction(newNumerator, newDenominator); } // 除法 public Fraction divide(Fraction f) { if (f.numerator == 0) { throw new IllegalArgumentException("除数不能为0"); } int newNumerator = this.numerator * f.denominator; int newDenominator = this.denominator * f.numerator; return new Fraction(newNumerator, newDenominator); } // 获取分子 public int getNumerator() { return numerator; } // 获取分母 public int getDenominator() { return denominator; } // 判断是否为整数 public boolean isInteger() { return numerator % denominator == 0; } // 转化为整数 public int toInteger() { return numerator / denominator; } // 转化为字符串 public String toString() { if (isInteger()) { return String.valueOf(toInteger()); } else { return String.format("%d/%d", numerator, denominator); } } // 获取最大公约数 private int gcd(int a, int b) { if (b == 0) { return a; } else { return gcd(b, a % b); } } } ``` 测试代码: ```java public class Main { public static void main(String[] args) { Fraction f1 = new Fraction(3, 4); Fraction f2 = new Fraction(1, 2); System.out.println(f1.add(f2)); // 输出5/4 System.out.println(f1.subtract(f2)); // 输出1/4 System.out.println(f1.multiply(f2)); // 输出3/8 System.out.println(f1.divide(f2)); // 输出3/2 } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值