【问题标题】:Java program runs slow?Java程序运行缓慢?
【发布时间】: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 &lt; 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 语句是不见了。

标签: java netbeans


【解决方案1】:

我的假设是在对它们执行数学运算时,它低于0,然后分配回zaehlernenner
需要更多时间的原因是因为这个代码(模数)

int ggTeiler = min(a, b);
while (a%ggTeiler != 0 || b%ggTeiler != 0) {
     ggTeiler--;
}

x % y 始终等于 x % -y
您可以将第二个操作数的符号视为被忽略。 x % 5(与x % -5相同)。

-5 %  11 == -5
 5 % -11 ==  5
-5 % -11 == -5

假设其中之一是-115-11 小于 5,然后分配给 ggTeiler
现在,5 % -11 = 5 为 != 0,循环继续。
ggTeiler-- -> -11-1=-12。
5 % -12 = 5 始终保持为 5,循环继续。
直到ggTeiler 它从最小整数变为最大整数值。参考this
因此,从最大正 int 值开始,当ggTeiler = -1 时,5 % ggTeiler != 0-11 % ggTeiler != 0 都变为 false。
然后循环退出。

练习跟踪你的程序。你会明白每一行的作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-18
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多