netbeans Java程序运行缓慢?

z0qdvdin  于 2022-11-10  发布在  Java
关注(0)|答案(1)|浏览(196)

我不明白为什么我的程序需要0秒来运行,如果有这2行在“private int ggT(int a,int B)”〉〉〉if (a < 0) a *= -1; if (b < 0 ) b *= -1;
如果我删除这两行代码,它需要超过30秒的时间来运行。我只是想了解这两行代码是做什么的,因为我没有写代码。我认为这两行代码是多余的。
顺便说一句,我想我是用java 8.0在NetBeans中编码的。
下面是整个程序:

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));
    }
}
acruukt9

acruukt91#

我的假设是,当对它们进行数学运算时,它会低于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,然后将5赋值给ggTeiler
现在,5 % -11 = 5等于!= 0,循环继续。
11 - 1 = -12。
5 % -12 = 5,其始终保持为5,并且循环继续。
直到ggTeiler,它从最小整数值到最大整数值。参见this
所以从最大正整数值开始,当5 % ggTeiler != 0-11 % ggTeiler != 0都为假时,ggTeiler = -1
然后退出循环。
练习跟踪你的程序。你会理解每一行的作用。

相关问题