繁体   English   中英

嵌套的“ FOR循环”无效

[英]Nested “FOR-loops” not working

我正在“ Java如何编程”一书中做练习。 练习要我写一个确定数字是否为“素数”的方法。 (“素数”是一个正整数,只能与1和1分开)。 然后,我应该在显示不超过10000的所有整数的应用程序中实现该方法。我使用“双值”来测试余数是否为0,以测试可除性。 无论如何,我只是无法使程序正常工作,它会显示3之前的所有数字,并且增加显示每个数字的次数(3 44 555等)。 谁能告诉我我做错了吗?

代码如下:

public class Oppgave625 
{

public static void main(String[] args) 
{
for(double a = 2; a <= 10000; a++)
    {
    for(double b = 1; b < a; b++)
        {
        if (prime(a, b) !=0)
            {
            System.out.printf("%.0f ", prime(a, b));
            }
        }

    }

}

static double prime(double x, double y)
{
if (x % y != 0)
    {
    return x;
    }
else
    {
    return 0;
    }
}

}

使用int代替。 双重不适合这个目的

您可能需要阅读本文,以了解%运算符对浮点数的使用。

为此,您发布了示例代码,这很好,但是有几处错误:

  • 您不应为此使用浮点类型,而应使用int或long。 绝对不能将浮点类型用于精确值。

  • 您正在对主要函数进行两次调用,实际上使所需步骤加倍

  • 您的素数函数仅告诉您两个数字是否均分,而不能告诉您一个数是否为素数

  • 对于质数,应该使用更高效的算法,而不是一遍又一遍地为每个数字计算相同的值。 查找Eratosthenes筛

实际上,这里有很多个人错误。 我将prime()函数缩短到仅是模运算的程度,因此可以内联它。 其次,我颠倒了测试,以便它检查没有余数的数字,并在找到除数后立即继续到下一个数字。 第三,我将b = 1更改为不检查是否可以被1整除的数字,因为这将导致所有数字。 最后,我打印出我们找不到除数的数字。 最终结果:

public static void main(String[] args) {
    outer:
    for (int a = 2; a <= 1000; a++) {
        for (int b = 2; b < a; b++) {
            if (a % b == 0) {
                continue outer;
            }
        }
        System.out.println(a);
    }
}

编辑:我忘了提,我也将类型从浮点数更改为整数,因为我确定这就是您的意思。

   boolean isPrime = true;
    for (int i = 2; i<=100; i++){
     for(int j = 2; j<=i/2; j++){
        isPrime = true;
         if (i%j==0){
           isPrime = false;
             break;
             }
            }
            if (isPrime){
                Log.d("PrimeNumber",""+i);
            }
        }

您正在解决这样的问题:每当我找到一个可以除以A且不除其A的数字B时,数字A就不是质数。 Bur现在,只要B无法将其分割,就可以打印出A。

相反,您可能会说:每当A无法被B整除时,请增加B。当我发现B将A分开时,退出内部循环,什么也不打印。 当我没有找到B时,打印A并退出循环。

此外,您只需要测试A的除数直到(a / 2)-1。

质数是一个只能被其自身整除的数字。 即:一个数字。 您的代码正在像欧几里德算法中那样比较两个数字以测试共素性 这与测试数字是否为数非常不同。

您的代码应如下所示:

for i = 2 to 10,000 {
    if( isPrime(i) ){
        print i
    }
}

function isPrime( int n ){
    for i = 2 to n {
        next if i == n
        if( n % i == 0 ){
            return 0;
        }
    }
    return 1;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM