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;
}
只有一种特殊情况错误
这种方法完全正确:
//约分
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);
}
求最大公因数应该用辗转相除法,你后面贴的代码其实就是,不过它用的是递归,完全可以写个while循环不用这么费劲
按理说你的代码除了效率低点问题不大,但是你考虑过分子是负数的情况吗,如果分子是负数你的循环根本不走