Prime测试,2位数字

时间:2010-10-27 18:57:17

标签: java loops primes

我想要打印所有长度为2位数的素数。这是我的代码:

    for(int input = 11; input <= 99; input += 2){
        for(int x = 2; x < (int)Math.sqrt(input) + 1; x++){
            if(input%x != 0){
                System.out.println(input);
                break;
            }else{
                break;
            }
        }
    }

问题在于它打印的数字如35或49不是素数。

9 个答案:

答案 0 :(得分:7)

您的完成度测试不正确。一旦找到input不能被整除的除数,就会停止测试一个数字(input)。

这不是素数的定义 - 你需要测试input数不能被任何除数整除 - 换句话说你需要测试{的所有值{1}}之前可以将数字声明为素数。

x可以被input % x != 0整除时,你可以突破检查input的循环,但是当它不可分割时,你可以在这个条件下继续检查是真的!

答案 1 :(得分:6)

我总是喜欢这样的问题:最简单,最明显的答案就是硬编码输出:

System.out.println("11\n13\n17\n19\n23\n29\n31\n37\n41\n43" +
   "\n47\n53\n59\n61\n67\n71\n73\n79\n83\n89\n97");

答案 2 :(得分:4)

要找到素数,您不需要测试下面的每个数字,直到它的平方根;你只需要测试它下面的每个其他素数。这是一个演示:

ArrayList<Integer> primes = new ArrayList<Integer>(); // hold every other prime numbers that we find
boolean isPrime;

// add first base prime number
primes.add(2);

for (int x = 3; x < max; x+=2) {  // start from 3 and skip multiples of 2
    isPrime = true;  // prove it's not prime
    for (Integer i : primes) {
        if (x % i == 0) {
            isPrime = false; // x is divisible by a prime number... 
            break; // exit loop, we proved it's not a prime
        }
    }
    if (isPrime) {
        if (x >= 10) {
            System.out.println(x);  // print only two digits prime numbers
        }
        primes.add(x);  // add x to our prime our number list for future checks
    }
}

** 编辑 **

静态方法中更灵活,可重用的实现(未针对列出大素数进行优化):

public static List<Integer> findPrimes(int min, int max) {
    LinkedList<Integer> primes = new LinkedList<Integer>();
    boolean isPrime;
    double square;

    // add first base prime number
    primes.add(2);

    for (int x = 3; x < max; x+=2) {  // start from 3 and skip multiples of 2

        isPrime = true;  // prove it's not prime
        square = Math.sqrt(x);
        for (Integer i : primes) {
            isPrime = x % i != 0;  // x is not prime if it is divisible by i
            if (!isPrime || i > square) { 
                break;
            }
        }
        if (isPrime) {
            primes.add(x);  // add x to our prime numbers
        }
    }

    // remove all numbers below min
    while (!primes.isEmpty() && primes.getFirst() < min) {
        primes.removeFirst();
    }

    return primes;
}

方法用法:

List<Integer> primes = findPrimes(10, 100);
System.out.println("Listing " + primes.size() + " prime numbers");
for (Integer prime : primes) {
    System.out.println(prime);
}

答案 3 :(得分:3)

维基百科为查找素数提供了一个很好的算法。它还列出了最多100个。

如果您正在寻找调试帮助,我只需单步执行您的代码,直到您看到哪些测试不正确为止。这是一个快速简单的程序,不应该花很长时间。

答案 4 :(得分:3)

问题在于此块:

if(input%x != 0)
{
System.out.println(input);
break;
}

如果它不能被'x'的当前值整除,它将打印'input',但它可以被'x'的下一个值整除。在这种情况下,“输入”不是素数,而是打印出来。

正确的代码:

boolean flag;
for(int input = 11; input <= 99; input += 2)
{
        flag = true;
        for(int x = 2; x < (int)Math.sqrt(input) + 1; x++)
        {
            if(input%x == 0)
            {
                flag = false;
                break;
            }
        }
        if(flag == true)
            System.out.println(input);
}

答案 5 :(得分:2)

for(int input = 11; input <= 99; input += 2){
    int found = 0;
    for(int x = 2; x < (int)Math.sqrt(input) + 1; x++)
        if(input%x == 0){
            found = 1;
            break;
        }
    if(found == 0)
        System.out.println(input);

}

这应该做的工作

答案 6 :(得分:2)

您正在打印所有奇数。你总是打破循环,所以x永远不会超过2。

if(input%x != 0){
    System.out.println(input);
    break;  // <<-- break here
}else{
    break;  // <<-- and break here
}

还要仔细考虑素数的定义:

  • 如果您测试的任何数字是一个精确的除数,则该数字不是素数。
  • 如果所有您测试的数字都不是精确的除数,则该数字为素数。

如果你发现了一个除数,你应该只打破循环。如果你还没有找到一个,你需要继续前进,直到你测试了所有的可能性。在你完成循环并知道结​​果之前,你不应该打印任何东西。

答案 7 :(得分:2)

这很有效。您可以看到输出here

public class Main {

public static void main(String[] args) {
for(int input = 11; input <= 99; input += 2){
    boolean found = false;
    for(int x = 2; x < (int)Math.sqrt(input) + 1; x++){
        if(input%x == 0){
            found = true;
            break;
        }

    }
    if(!found) {
            System.out.println(input);
    }
}
}
}

答案 8 :(得分:0)

是的,因为它打印出所有发现非因素的情况。 您只需打印出无法找到因素的案例。