花瓣落下飞舞之时 2022-03-23 17:02 采纳率: 100%
浏览 10
已结题

【改错】 “Java约分” 的错误

问题遇到的现象和发生背景

PTA天梯赛第九题,需要约分

问题相关代码,请勿粘贴截图
boolean f = false;      //f判断是否有公因数,gg为最大公因数,Zi为分子(已确认不为0),Mu为分母
            long gg=0;
            for (long i = 2; i <= resZi; i++) {
                if (resZi % i == 0 && resMu % i == 0) {
                    gg=i;
                    f = true;
                }
            }
            if (f) {
                resZi /= gg;
                resMu /= gg;
            }
运行结果及报错内容

只有一种特殊情况错误

img

我的解答思路和尝试过的方法

这种方法完全正确:

//约分
        long gg =gcd(Math.abs(resZi), Math.abs(resMu));// 分子为0不需要约分
        resZi /= gg;
        resMu /= gg;
······
private static long gcd(long nfz, long nfm) {
        long a = Math.min(nfz, nfm);
        long b = Math.max(nfz, nfm);
        if (b % a == 0) {
            return a;
        }
        return gcd(a, b % a);
    }
我想要达到的结果

img

  • 写回答

1条回答 默认 最新

  • 於黾 2022-03-23 17:24
    关注

    求最大公因数应该用辗转相除法,你后面贴的代码其实就是,不过它用的是递归,完全可以写个while循环不用这么费劲
    按理说你的代码除了效率低点问题不大,但是你考虑过分子是负数的情况吗,如果分子是负数你的循环根本不走

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月31日
  • 已采纳回答 3月23日
  • 创建了问题 3月23日

悬赏问题

  • ¥15 52810 尾椎c三个a 写蓝牙地址
  • ¥15 elmos524.33 eeprom的读写问题
  • ¥15 使用Java milo连接Kepserver服务端报错?
  • ¥15 用ADS设计一款的射频功率放大器
  • ¥15 怎么求交点连线的理论解?
  • ¥20 软件开发方法学习来了
  • ¥15 微信小程序商城如何实现多商户收款 平台分润抽成
  • ¥15 HC32L176调试了一个通过TIMER5+DMA驱动WS2812B
  • ¥15 cocos的js代码调用wx.createUseInfoButton问题!
  • ¥15 关于自相关函数法和周期图法实现对随机信号的功率谱估计的matlab程序运行的问题,请各位专家解答!