static void primeNumbers(int n)
{
System.out.println("All the prime numbers up to "+n+" are -->\n");
boolean isPrime = true;
for(int i = 2; i < n; i++)
{
for (int j = 1; j < i; j++)
{
if(i % j == 1)
{
isPrime = true;
System.out.print(j);
}
if(i % j == 0)
{
isPrime = false;
System.out.print(" ");
}
}
}
}
在这段代码中,我试图列出所有素数到&#39; n&#39;这是用户输入的数字。我很困惑如何解决这个问题,以产生所有素数到n。
答案 0 :(得分:1)
您想测试i
是否可以被[2..i-1]范围内的任何数字分割,如果是,那么它不是素数。你的j
- 循环从1开始,这是第一个错误。
知道某个数字何时可被另一个人分割,如下所示进行测试:if (i % j == 0) {
(如果除数余数为零)在代码中,用1来测试相等性。
第三件事是你在第一次迭代中做出决定(当j为1时)并且总是在你的内循环中打印一些东西。你需要从内循环中取出逻辑。只有当我不能被{{1>}的任何分开时,它才是主要的。
以下是您的代码的修改版本:
j
答案 1 :(得分:0)
if (i % j == 0) {
isPrime = false;
System.out.print(" ");
}
对于任何i
,此if语句始终为true,因为j
从1开始。因此,您为每个数字打印一个空格&lt; n
和&gt; = 2
此外,isPrime
可能是一个不必要的变量。
答案 2 :(得分:0)
你的算法虽然很慢,但在大多数部分似乎都是正确的,除了你没有很好地处理边界条件这一事实。例如。 2是素数,你只运行迭代直到n-1,你没有为每个数字和一些小东西重置isPrime标志。这是修订后的工作版本。尝试将它与你的比较,并了解你没有做对的地方。
int n = 10;
System.out.println("All the prime numbers up to "+n+" are -->\n");
boolean isPrime = true;
for(int i = 2; i <= n; i++)
{
for (int j = 2; j < i; j++)
{
if(i % j == 0)
{
isPrime = false;
break;
}
}
if(isPrime) {
System.out.println(i);
}
isPrime = true;
}
答案 3 :(得分:0)
在第二个for循环中不要将isPrime
重新设置为true,只要数字不是一次,我们就知道它永远不是素数。只需在外循环的每次迭代中将其设置为true,并在外部进行最终的“Is prime”检查。
static void isPrime(int n)
{
System.out.println("All the prime numbers up to "+n+" are -->\n");
for(int i = 2; i <= n; i++)
{
boolean isPrime = true;
for (int j = 2; j < i; j++)
{
if(i % j == 0)
{
isPrime = false;
System.out.println(i + " is not prime because " + i + " is divisible by " + j );
break;
}
}
if (isPrime){
System.out.println(i + " is prime.");
}
}
}
我在这段代码中添加了几个打印件,以便您可以看到为什么逻辑的每个部分都在做它的作用 - 将它与您的代码进行比较,以便您可以理解为什么您的实际上不会搜索素数
答案 4 :(得分:-1)
我认为你的脚本中存在逻辑问题。 您应该使用一个循环计数从2到n-1的所有数字,其中=到0并带有测试
n%i = 0
如果计数器= 0则没有除法器,则为素数