You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java分数类add/simplify方法、GCD计算问题排查与实现咨询

代码问题排查与修正

现存问题

  • 类名不匹配:你定义的分数类名为lab4Fraction,但测试代码中实例化的是Fraction类,会直接触发编译错误,统一类名即可解决。
  • add方法不符合需求:实验要求相加后返回新的Fraction对象作为结果,当前实现为void返回值,直接修改调用方法的对象本身的分数值,逻辑不符合要求。
  • 化简逻辑未生效:虽然实现了simplify方法和GCD计算,但分数运算完成后从未调用该方法,无法自动约分为最简形式;同时原有GCD逻辑未处理负数场景,可能出现分母带负号的不规范输出。
  • 输入校验不完善:输入分母为0时仅打印错误提示,没有做兜底处理,后续运算会触发除0异常。
  • 测试逻辑错误:现有测试循环只会反复覆盖同一个分数对象的属性,从未调用add方法执行累加操作,最终输出的只是最后一次输入的合法分数,完全没有验证加法功能。

关于构造函数的疑问

完全可以不手动编写构造函数实现所有功能。Java的类如果没有手动定义任何构造方法,编译器会自动生成一个无参的默认构造方法,你代码中写的new Fraction()就是调用这个默认构造。只要你不主动定义带参数的构造方法覆盖默认实现,不需要手动写构造函数。

修正后代码

Fraction分数类

import java.util.Scanner;

public class Fraction {
    
    private int numerator;
    private int denominator;
        
    public void setNumerator(int num){
        numerator = num;
    }

    public void setDenominator(int denominator) {
        if (denominator == 0) {
            System.out.println("Invalid denominator! Set to 1 by default.");
            this.denominator = 1;
            return;
        }
        this.denominator = denominator;
    }
    
    public void inputValues(){
        Scanner keyboard = new Scanner(System.in);
        System.out.println("Enter numerator : ");
        numerator = keyboard.nextInt();
        
        System.out.println("Enter denominator : ");
        denominator = keyboard.nextInt();
        
        if(denominator == 0) {
            System.out.println("Invalid denominator! Set to 1 by default.");
            denominator = 1;
        }
        // 统一将负号放置在分子位
        if (denominator < 0) {
            numerator = -numerator;
            denominator = -denominator;
        }
    }
    
    public void outputValues(){
        System.out.print(this);
    }
    
    public int getNumerator(){
        return numerator;
    }
    
    public int getDenominator(){
        return denominator;
    }
    
    public Fraction add(Fraction fracNum){
        Fraction res = new Fraction();
        int newDenominator = this.denominator * fracNum.getDenominator();
        int newNumerator = this.numerator * fracNum.getDenominator() + fracNum.getNumerator() * this.denominator;
        res.setNumerator(newNumerator);
        res.setDenominator(newDenominator);
        res.simplify();
        return res;
    }
    
    public String toString() {
        return numerator + "/" + denominator;
    }
    
    private void simplify(){
        int commonDivisor = GCD(numerator, denominator);
        numerator = numerator / commonDivisor;
        denominator = denominator / commonDivisor;
        if (denominator < 0) {
            numerator = -numerator;
            denominator = -denominator;
        }
    }

    private int GCD(int a, int b) {
        // 辗转相除法求最大公约数,取绝对值消除负数影响
        a = Math.abs(a);
        b = Math.abs(b);
        int c;
        while (a != 0 && b != 0){
            c = b;
            b = a % b;
            a = c;
        }
        return a + b;
    }
    
}

测试类

public class lab4TestFraction {

    public static void main(String[] args) {
        // 初始化累加结果为0/1
        Fraction result = new Fraction();
        result.setNumerator(0);
        result.setDenominator(1);
        while(true){
            Fraction inputFrac = new Fraction();
            inputFrac.inputValues();
            if(inputFrac.getNumerator() < 0){
                break;
            }
            result = result.add(inputFrac);
            System.out.println("Current accumulated result: " + result);
        }
        System.out.print("Final result: ");
        result.outputValues();
    }

} 

内容的提问来源于stack exchange,提问作者Sheng Yao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 15:51:38