在switch语句中使用逻辑

时间:2013-04-20 13:51:24

标签: java switch-statement

我的问题与以下代码有关:

public static void main(String[] args) {

    // Find Prime Numbers from 0 to 100
    int i;
    for (i=2; i <= 100; i++) {
        int j = 2;
        boolean iPrime = true;

        //The following line gives incorrect results, but should execute faster
        //  while ((iPrime = true) && (j < (i / 2 + 1))) {
        //The following line gives correct results but performs un-necessary operations
        //by continuing to calculate after the number is found to be "not prime"
        while (j < (i / 2 + 1)) {

            j++;
            if ((i % j) == 0) {
                iPrime = false;
                //System.out.println(j + " is a factor of " + i);
            }
        }
        if (iPrime) {
            System.out.println(i + " is a prime number!");
        }
    }
}

现在,正如我在代码中所评论的那样,我想要实现的是通过仅在iPrime = true时执行'while'循环来更快地执行我的程序。 50%的数字可以被2整除,所以一旦确定,计算就可以停止了。

我正在从一本书中作为初学者'例子'的一部分来做这个项目,我实际上是想尽快为自己的“额外信用”计算高达1000000 ......

我读到了“短路”和“操作员”&amp;&amp;如果前半部分为真,则仅评估语句的后半部分,如果为假,则两者不相互评估(节省CPU)

它也将退出循环,这将节省更多的CPU ......

但由于某种原因,它无法正常工作!我在整个过程中添加了更多的System.out.println()语句,列出了'iPrime'是什么 - 输出是奇怪的......它打开和关闭iPrime并评估每个数字,这是我无法理解的。

4 个答案:

答案 0 :(得分:7)

if((iPrime = true) && ...)应为if((iPrime) && ...)

通过执行isPrime = true,您将真实分配给isPrime而不是其值'与true进行比较。

您可能还希望看到this以更好地了解代码中发生的情况:

  

在运行时,赋值表达式的结果是值   分配发生后的变量。一个结果   赋值表达式本身不是变量。

因此,当您使用=运算符而不是==时(在将某些内容与true进行比较时将其删除 - 而不是编写if(someBoolean == true),您只需编写if(someBoolean) 1}}),你实际上是在满足条件,总是

答案 1 :(得分:4)

只需将=更改为==,即更改

while ((iPrime = true) && (j < (i / 2 + 1)))

while ((iPrime == true) && (j < (i / 2 + 1)))

性能更佳的完整代码

public static void main(String[] args) {
    // Find Prime Numbers from 0 to 100
    System.out.println(2 + " is a prime number!");
    for (int i = 3; i <= 100; i += 2) {
        boolean isPrime = true;
        for (int j = 3; j * j <= i; j += 2) {
            if ((i % j) == 0) {
                isPrime = false;
                break;
            }
        }
        if (isPrime) {
            System.out.println(i + " is a prime number!");
        }
    }
}

我能想到的最快的方法是Sieve of Eratosthenes

答案 2 :(得分:1)

johnchen902 / Maroun Maroun有你的错误修复;此外,您可以执行的优化是

System.out.println("2 is a prime number!"); // the for loop won't detect 2 anymore
for (i=3; i <= 100; i+=2) {

此外,不是对具有所有前面奇数的数字执行模运算符以查看它是否为素数,而是可以对具有所有前面素数的数字执行模运算符,以查看它是否为素数 - 例如,存储您在ArrayList中找到的素数,并在主要测试中遍历列表。

对于非常节省CPU(但空间效率较低)的算法,请使用Sieve of Eratosthenes

答案 3 :(得分:1)

首先,在运行代码时,我发现它显示4为素数,这是不正确的。原因是你的j ++线的位置。您应该将while循环更改为:

while (j < (i / 2 + 1)) {   
                if ((i % j) == 0) {
                    iPrime = false;

                    //System.out.println(j + " is a factor of " + i);
                    break;
                }
                j++;
            }

转到第二部分,当您确定数字不是素数时,您希望避免额外的计算。您可以在上面的代码中使用break语句。

注释部分不起作用,因为您有一个赋值而不是相等比较。