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;
}
}
}
# 1 楼答案
# 2 楼答案
您为此发布了示例代码,这很好,但有几点是错误的:
对此,不应使用浮点类型,而应使用int或long。浮点类型不应用于精确值
您对prime函数进行了两次调用,有效地将所需步骤加倍
素数函数只告诉您两个数是否等分,而不告诉您一个数是否为素数
对于素数,您应该使用更有效的算法,而不是对每个数反复计算相同的值。查找Sieve of Eratosthenes
# 3 楼答案
实际上,这里有很多个人的错误。我将
prime()
函数缩短到只有模运算的程度,因此我能够内联它。第二,我将测试反转,以便它检查而不是有余数的数字,并在找到除数后继续下一个数字。第三,我更改了b = 1
,这样我们就不会检查可被1整除的数字,因为这将导致所有数字。最后,我只打印出我们没有发现除数的数字。最终结果是:编辑:我忘了提到,我还将类型从float更改为int,因为我相信这就是你的意思
# 4 楼答案
你是这样处理这个问题的:只要我能找到一个不需要余数就能除A的数B,A就不是素数。 但是现在,只要A不可除以B,就打印出A
相反,你可以说:当A不能被B整除时,增加B。当我发现A可以被B整除时,退出内部循环,不打印任何内容。 当我发现没有B时,打印A并退出循环
此外,您只需要测试A直到(A/2)-1的整除性
# 5 楼答案
改用int。双倍不适合这个目的
您可能需要阅读this article以了解%运算符对浮点数的使用
# 6 楼答案
素数是一个只能被一和它本身整除的数。那就是:一个数字。您的代码正在比较两个数字,就像测试coprime-ness的欧几里德算法一样。这与测试一个数是否为prime非常不同
您的代码应该如下所示: