-3
package PrimeNum;

public class primeNum {
public static void main(String args[]){
    int flag = 0;
    /*
    for(int i = 2; i <= 100; i++){
        if(i % 2 != 0 && i % 3 != 0 && i % 4 != 0 && i % 5 != 0 && 
                i % 6 != 0 &&  i % 7 != 0 && i % 8 != 0 && i % 9 != 0 && i % 10 != 0 ){
            System.out.print(i + " ");
        }
    }
    */
    System.out.println();

    for(int i = 2; i <= 100; i++){

        for(int j = 2; j <= 10; j++){
            if(i % j != 0) { 
                flag++;
            }
        }

        if(flag == 9 || flag == 8){
            System.out.print(i + " ");
            flag = 0;
        }
    }
}

}

The code is made using Java and I can't seem to find why it only prints 2 and 3 all throughout the loop to 100. Any Help please?

4

5 回答 5

1

嗯,解释起来并不难(虽然我不知道你为什么写这段代码,但这绝对不是主要测试)。

在您的内部循环中,您测试当前数字是否可被数字 2 到 10 整除(您计算不除的数字的数量i)。

对于i=2,只有 2 个除法i,所以在内循环之后,flag = 8( 3 .. 10)。因此,您打印2并重置flag.

对于i=3,只有 3 个除法i,所以在内循环之后,flag = 8(24 .. 10)。因此,您打印3并重置flag.

对于i=4, 两者24i, 所以在内循环之后, flag = 7. 您不打印任何内容,也不重置 flag

因为i=5,只有5分i。由于您没有 reset flag,它将flag = 15在内部循环之后。您将永远不会再重置flag,因此您不再打印任何数字。

于 2013-08-06T09:27:40.767 回答
1

这应该有效:

package PrimeNum;

    public class primeNum {
    public static void main(String args[]){
        int flag = 0;
        System.out.println();

        for(int i = 2; i <= 100; i++){
            flag = 0;//Initialize flag to 0 here

            for(int j = 2; j <= 10; j++){
                if(i % j != 0) { 
                    flag++;
                }
            }

            if(flag == 9 || flag == 8){
                System.out.print(i + " ");
                flag = 0;
            }
        }
    }
}

找到素数的正确方法

public static void main(String[] args) {
        int flag = 0;
        for (int i = 2; i <= 100; i++) {
            flag = 0;
            for (int j = 2; j <= i - 1; j++) {
                if (i % j != 0) {
                    flag++;
                }
            }

            if (flag == i - 2) {
                System.out.print(i + " ");
            }
        }
    }
于 2013-08-06T09:27:49.407 回答
0

这可能会帮助你

 boolean isPrime=true;
    for(int i = 2; i <= 100; i++){
        for(int j=2; j<i; j++){
            if(i%j == 0){
               isPrime=false;
            }
        }
        if(isPrime){
            System.out.print(i+" ");
        }
        isPrime=true;
    }

输出

2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 
于 2013-08-06T09:37:12.497 回答
0

您测试每个数字的想法,计算除数的数字并在该数量与标准匹配时打印它是好的,但我会稍微颠倒测试。

素数恰好有两个正除数,1 和数字本身

如果您测试 2 和 number - 1 之间的每个数字,您应该会找到 0 个除数。对于每个数字都是如此,您不必知道有多少除数不是除数,也不必测试每个数字的每个除数,25 不能是 10 的除数,因为它更大。

public static void simplePrintPrimesUpTo(int max) {
    // test every number between 2 and max inclusive
    for (int number = 2; number <= max; number++) {
        int foundDivisors = 0;

        // test every divisor between 2 and 1 less than the current number
        for (int divisor = 2; divisor < number; divisor++) {
            if (number % divisor == 0) {
                foundDivisors++;
            }
        }

        if (foundDivisors == 0)
            System.out.print(number + " ");
    }
    System.out.println();
}

这可以进一步优化。除数的一个有趣性质是

n 的除数必须小于或等于 n 的平方根

这意味着divisor <= sqrt(number)在内部循环中使用作为上限将大大减少所需的测试量。不幸的是,计算 on int 的平方根很难看,但是该公式可以在两边取平方,并且测试变得更简单。

(divisor)^2 <= (sqrt(number))^2

可以简化为

(divisor)^2 <= number

可以进行的下一个优化是在找到测试除数时跳过测试除数。有 2 个或 10 个都没有关系,如果我们找到一个,它就不是质数。结果可能如下所示

public static void optimizedPrintPrimesUpTo(int max) {
    nextNumber:
    for (int number = 2; number <= max; number++) {

        for (int divisor = 2; (divisor * divisor) <= number; divisor++) {
            if (number % divisor == 0) {
                // skip testing this number, continue in the outer loop
                continue nextNumber;
            }
        }

        System.out.print(number + " ");
    }
    System.out.println();
}
于 2013-08-06T10:30:15.537 回答
0

关于什么:

public static void main(String args[]){

    System.out.println();

    for(int i = 2; i <= 100; i++){

        int flag = 0;

        for(int j = 2; j <= i; j++){
            if(i % j == 0) {
                flag++;
            }
        }

        if(flag == 1){
            System.out.print(i + " ");
        }
    }
}

回报:

2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
于 2013-08-06T09:40:42.307 回答