有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java嵌套的“FORloops”不起作用

我正在《Java如何编程》一书中做练习。这个练习想让我写一个方法来确定一个数字是否是“素数”。(一个“素数”是一个正整数,它只能与其自身和1相除)。然后,我应该在一个显示所有整数(最多10000个)的应用程序中实现该方法。 我使用“双值”来测试余数是否为0,以测试可分割性。 不管怎样,我只是没有让程序工作,它显示3的所有数字,每个数字的显示次数递增(344555等)。谁能告诉我我做错了什么

代码如下:

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) 个答案

  1. # 1 楼答案

       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);
                }
            }
    
  2. # 2 楼答案

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

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

    • 您对prime函数进行了两次调用,有效地将所需步骤加倍

    • 素数函数只告诉您两个数是否等分,而不告诉您一个数是否为素数

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

  3. # 3 楼答案

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

    编辑:我忘了提到,我还将类型从float更改为int,因为我相信这就是你的意思

  4. # 4 楼答案

    你是这样处理这个问题的:只要我能找到一个不需要余数就能除A的数B,A就不是素数。 但是现在,只要A不可除以B,就打印出A

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

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

  5. # 5 楼答案

    改用int。双倍不适合这个目的

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

  6. # 6 楼答案

    素数是一个只能被一和它本身整除的数。那就是:一个数字。您的代码正在比较两个数字,就像测试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;
    }