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