嵌套的“FOR-loops”无法正常工作

时间:2011-12-11 18:21:06

标签: java for-loop

我正在“Java如何编程”一书中进行练习。练习要我写一个方法来确定一个数字是否是“素数”。 (“素数”是一个正整数,只能用自身和1)分割。然后我应该在一个应用程序中实现该方法,该应用程序显示最多10 000的所有整数。 我使用“双值”来测试余数是否为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;
    }
}

}

6 个答案:

答案 0 :(得分:3)

使用int代替。双重不利于此目的

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

答案 1 :(得分:1)

您为此发布了示例代码,这很棒,但有几件事情是错误的:

  • 你不应该为此使用浮点类型,而是使用int或long。永远不要将浮点类型用于精确值。

  • 你正在两次调用你的素数函数,有效地将所需步骤加倍

  • 你的素数函数只告诉你两个数字是否均匀分配,它不会告诉你一个是否是素数

  • 对于素数,您应该使用更有效的算法,而不是为每个数字反复计算相同的值。查看Sieve of Eratosthenes

答案 2 :(得分:1)

实际上,这里有很多个别错误。我将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);
    }
}

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

答案 3 :(得分:0)

你正在接近这样的问题:数字A不是素数,只要我能找到一个可以在没有余数的情况下划分A的数字B. Bur现在,只要B不可分割就打印出A.

相反你可以说:每当A不能被B整除时,增加B.当我发现B除以A时,退出内循环,不打印任何东西。 当我没有找到B时,打印A并退出循环。

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

答案 4 :(得分:0)

素数是一个只能被1和它自身整除的数字。那是:一个数字。您的代码正在比较欧几里德算法中的两个数字,以便对coprime-ness进行测试。这与测试数字是否为prime非常不同。

您的代码应如下所示:

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

答案 5 :(得分:0)

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