Prime Numbers Java - 我的错误

时间:2014-03-18 17:34:32

标签: java

public class primzahlen {

public static void main(String[] args) {

    System.out.println(2 % 1);

    calculate_primenumber(10);

}

static void calculate_primenumber(int a) {

    int zahl = 1;
    boolean isprimenumber = false;

    for (int i = 1; i <= a; i++) {
        for (int j = 1; j <= i; j++) {
            if (i % j > 0) {
                // No PrimeNumber
                isprimenumber = false;
            } else {
                // Is PrimeNumber
                isprimenumber = true;
                zahl = i;
                System.out.println(zahl);
            }

        }

    }

}

}

我不知道为什么这不起作用。

我想计算10个素数。

但不知何故,它只打印最多10次3次,就是这样。

我不知道我的错误。

我有2个for循环。这就是我如何学习素数计算,我必须使用2 for循环,但它不起作用。我首先想到的是%(其余的)但是当我在纸上做它应该有用。

4 个答案:

答案 0 :(得分:1)

&#34;我想检查10个素数&#34;

当你说

for (int i = 1; i <= a; i++)

您说&#34;数字从1到a,&#34;在这种情况下,这是1到10.因此,您只能检查1到10的素数。 a是您在数字上的上限,用于检查素数。

如果你想获得前10个素数,你将不得不使用一个条件来检查你发现的素数(并保持计数)。

&#34;它只打印最多10次3次,就是这样#34;

您的模数检查应为(i % j == 0) - 这意味着j均分i,因此是i的因子。您的立场就是说,如果任何j不是i的因素,则该数字会立即合成。这不仅不是一个正确的结论,而且还可以帮助你做出决定。你应该假设它是素数,直到你可以证明它是复合的 - 然后你可以提前决定。

要记住的一件事是,一个数字,mod本身,总是0.同样适用于数字mod 1.所以,你必须确保你不比较任何i自己或与1.更改第二个for循环以在j < i时停止并以j = 2开头。

for (int i = 1; i <= a; i++) {
    isprimenumber = true;
    for (int j = 2; j < i; j++) {
        // check each number less than this one for factors
        if (i % j == 0) {
            // found an even divisor, so the number is composite
            isprimenumber = false;
            break;
        }
    }
    if (isprimenumber) {
        System.out.println(i);
    }
}

您可以通过注意1通常不被视为素数来进行其他优化,因此您可以让您的第一个循环为for (int i = 2; i <= a; i++)并且还考虑到没有更大数的偶数除数超过该数字的一半,因此您可以将第二个循环设为for (int j=2; j < i/2; j++)

答案 1 :(得分:1)

您的代码至少有四个问题。

首先,你有%条件。如果您正在测试号码i,并且想要查看它是否具有除数j,那么您需要测试i % j == 0。如果这是真的,那么这个数字不是素数。但是,你测试它的方式,你告诉它如果i % j 为零,那么这个数字不是素数。

其次,当您进行测试以查看某些内容是否分为i时,您无法测试1,并且您无法测试i本身。因此,

 for (int j = 1; j <= i; j++) {

看起来应该更像

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

虽然通常是

 for (int j = 2; j < Math.sqrt(i); j++) {

因为一旦超过i的平方根,您就不需要再搜索了。

第三:你的内部循环在每次迭代时将isprimenumber设置为truefalse。那是不对的。如果我们发现i有除数的情况,我们知道isprimenumberfalse,我们应该永远再次将其设置为true ,为i。所以像这样的循环可以工作:

    isprimenumber = true;
    for (int j = 2; j < i; j++) {
        if (i % j == 0) {
            // No PrimeNumber
            isprimenumber = false;
        } 
            // If it's non-zero, don't set isprimenumber to true, because if we
            // set it to false earlier, then it still should be false! 

    }

    // And wait until we've tested all the j's before we can tell if it's true.
    if (isprimenumber) {
    }

您也可以在break之后加isprimenumber = false,因为一旦我们找到了除数,我们就不需要继续寻找。

    for (int j = 2; j < i; j++) {
        if (i % j == 0) {
            // No PrimeNumber
            isprimenumber = false;
            break;
        } 

如果没有break,循环会继续几次,但它不会做任何有用的事情。 (但它也不会有害。)

第四,你说要打印10个素数,但你的逻辑测试了从1到10的所有数字,并且在该范围内没有10个素数。如果您想要参数a为10的前10个素数,则无法在i <= a停止循环:

for (int i = 1; i <= a; i++) {

相反,您需要声明另一个计数器来计算素数的数量。

int count = 0;

当你找到一个素数并打印出来时:

count++;

然后你可以像这样编写你的for循环:

for (int i = 1; count < a; i++) {

并且当素数达到a时它将停止。

编辑:我错过了一个错误:我建议的代码会发现1是素数,但从技术上讲它不是(所以说数学家)。所以你应该从i = 2开始:

for (int i = 2; count < a; i++) {

答案 2 :(得分:0)

这是一种方式

public class Primzahlen {

public static void main(String[] args){

calculate_primenumber(10);

}

static void calculate_primenumber(int a) {

int primesFound = 0;
boolean isprimenumber;


for(int i = 2; primesFound < a; i++){
    isprimenumber = true;
    for(int j = 2; j < i ; j++){
        if(i % j == 0){
            isprimenumber = false;
            break;
        }
    }

    if(isprimenumber){
        primesFound++;
        System.out.println(i);
    }
}

}

}

但你可以提高效率。这只是一种方式:klick

答案 3 :(得分:-1)

你必须在循环结束时做正确的事情:

for (int i = 1; i <= a; i++) {
    for (int j = 1; j <= i; j++) {
        if (i % j > 0) {
            // No PrimeNumber
            isprimenumber = false;
        } else {
            // Is PrimeNumber
            isprimenumber = true;
        }

    }
    if(isprimenumber)
        System.out.println(i);

}

如果测试了所有数字,你只能告诉它。