花瓣落下飞舞之时 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 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用
  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教