繁体   English   中英

i--中的死代码警告

[英]Dead code warning in the i--

我将尝试定义返回最大公约数的函数。 现在,我遇到了一些障碍。 为什么在i--中出现死代码警告? 我什么都感觉不到,所以请让我知道出了什么问题。

public class Main {

    public static int function(int a, int b, int c) {
        int min;
        if (a > b) {
            if (b > c) {
                min = c;
            } else {
                min = b;
            }
        } else {
            if (a > c) {
                min = c;
            } else {
                min = a;
            }
        }
        for (int i = min; i > 0; i--) {
            if (a % i == 0 && b % i == 0 && c % i == 0) {
                return i;
            }
            return -1;
        }
        return 0;
    }

    public static void main(String[] args) {

        System.out.println("(400, 300, 750)의 최대 공약수 : " + function(400, 300, 750));

    }

}

for循环有一个if块,如果找到,则返回最大的除数。 如果不是,则返回-1。 因此循环将永远不会继续,并且“ i--”将永远不会执行。 这就是为什么它是无效代码的原因。 删除“ return -1”,它应该可以正常工作。

在调试器中单步执行代码通常是查找这些错误的最快方法。 但是,通过仅检查作为min一个因素的值,可以使代码更快。 这样可以大大减少迭代次数。

public class Main {

    public static int function(int a, int b, int c) {
        int min;
        if (a > b) {
            if (b > c) {
                min = c;
            } else {
                min = b;
            }
        } else {
            if (a > c) {
                min = c;
            } else {
                min = a;
            }
        }
        for (int i = min; i > 0; i--) {
            if (a % i == 0 && b % i == 0 && c % i == 0) {
                System.err.println("Iterations " + (min + 1 - i));
                return i;
            }
        }
        return 0;
    }

    public static long gcd(long a, long b, long c) {
        long min = Math.min(a, Math.min(b, c));
        for (int j = 1, max = (int) Math.sqrt(min); j <= max; j++) {
            long i = min / j;
            if (a % i == 0 && b % i == 0 && c % i == 0) {
                System.err.println("Iterations: " + j);
                return i;
            }
        }
        return 1;
    }

    public static void main(String[] args) {
        System.out.println("(400, 300, 750)의 최대 공약수 : " + function(400, 300, 750));
        System.out.println("(400, 300, 750)의 최대 공약수 : " + gcd(400, 300, 750));
    }
}

版画

(400, 300, 750)의 최대 공약수 : 50
(400, 300, 750)의 최대 공약수 : 50
Iterations 251
Iterations: 6

在您的方法中,它必须考虑从300到50(251个值)的所有因素。 但是仅考虑300的因数,即300 / 1、300 / 2、300 / 3、300 / 4、300 / 5、300 / 6(6个值),则速度要快得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM