【发布时间】:2021-11-14 17:46:22
【问题描述】:
如果“private int ggT(int a, int b)”中有这两行,我不明白为什么我的程序需要 0 秒才能运行 >>> if (a < 0) a *= -1; if (b < 0 ) b *= -1;
如果我删除这 2 行,它需要超过 30 秒才能运行。 我只是想了解这两行代码的作用,因为我没有编写代码。而且我认为这两行是多余的。
顺便说一句,我猜我在 Netbeans 中使用 java 8.0 进行编码。
这是整个程序:
public class Bruch {
private int zaehler;
private int nenner;
public Bruch(int zaehler, int nenner){
this.zaehler = zaehler;
this.nenner = nenner;
if (zaehler < 0 & nenner < 0) {
this.nenner *= -1;
this.zaehler *= -1;
}
kuerzeDich();
}
private int min(int a, int b) {
if (a < b) return a;
return b;
}
private int ggT(int a, int b) {
if (a < 0) a *= -1;
if (b <0 ) b *= -1;
int ggTeiler = min(a, b);
while (a%ggTeiler != 0 || b%ggTeiler != 0) {
ggTeiler--;
}
return ggTeiler;
}
private void kuerzeDich() {
int ggTeiler = ggT(zaehler, nenner);
zaehler = zaehler / ggTeiler;
nenner = nenner / ggTeiler;
}
@Override
public String toString() {
return String.valueOf(zaehler + "/" + nenner);
}
public Bruch kehrwert() {
return new Bruch(nenner, zaehler);
}
public Bruch add(Bruch pOther) {
int ggTeiler = ggT(nenner, pOther.nenner);
int kgV = nenner * pOther.nenner / ggTeiler;
int neuerZaehler = zaehler * (kgV/nenner) + pOther.zaehler * (kgV/pOther.nenner);
return new Bruch(neuerZaehler, kgV);
}
public Bruch sub(Bruch pOther) {
int ggTeiler = ggT(nenner, pOther.nenner);
int kgV = nenner * pOther.nenner / ggTeiler;
int neuerZaehler = zaehler * (kgV/nenner) - pOther.zaehler * (kgV/pOther.nenner);
return new Bruch(neuerZaehler, kgV);
}
public Bruch mul(Bruch pOther) {
int neuerzaehler = zaehler * pOther.zaehler;
int neuernenner = nenner * pOther.nenner;
return new Bruch(neuerzaehler, neuernenner);
}
public Bruch div(Bruch pOther) {
return new Bruch(zaehler,nenner).mul(pOther.kehrwert());
}
public static void main(String[] args) {
Bruch b1 = new Bruch(1, 6);
Bruch b2 = new Bruch(3, 4);
System.out.println(b1.add(b2));
System.out.println(b1.sub(b2));
System.out.println(b1.mul(b2));
System.out.println(b1.div(b2));
}
}
【问题讨论】:
-
if (a < 0) {a = a*(-1);}怎么看? -
a *=-1;与
a = a*(-1)相同;与a = a multiply -1相同;显然值发生了变化,那么公式将需要做更多的工作,因此需要更长的时间。 -
但是这两行不应该用于主函数中的这些数字,因为 a 和 b 都不小于 0
-
1/6 - 3/4是-7/12- 所以是的,它们是负面的。ggT()的实现方式然后(几乎)尝试从 -7 到 Integer.MIN_VALUE 到 Integer.MAX_VALUE 到 1 的所有可能整数值,以找到 -7 和 12 的ggT,如果这两个if语句是不见了。