Prime Number功能仅打印2和3

时间:2013-08-06 09:19:09

标签: java primes

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

}

代码是使用Java制作的,我似乎无法找到为什么它只在整个循环中打印2和3到100。请帮助吗?

5 个答案:

答案 0 :(得分:1)

嗯,解释并不是那么困难(虽然我不知道为什么你写这个代码,但它肯定不是主要的测试)。

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

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

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

对于i=424分为i,因此在内循环之后flag = 7。您不打印任何内容,不重置 flag

对于i=5,只有5个除以i。由于您未重置flag,因此在内循环后它将为flag = 15。您将永远不会重置flag,因此您不再打印任何数字。

答案 1 :(得分: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 + " ");
            }
        }
    }

答案 2 :(得分: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;
    }

Out put

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 

答案 3 :(得分: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

答案 4 :(得分:0)

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

  

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

如果你测试2和数字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();
}