我目前正在开发一个程序,用户输入一个数字,程序将为您提供最多该数字的素数。虽然没有错误,但程序始终输出相同的数字:3。这是代码:
public static int Prime(int num){
boolean isPrime = true;
int count = 0;
for (int a = 2; a <=num; a++){
for (int i = 2; i <= a/2; i++){
if (a == 2 || a == 3 || a == 5){
isPrime = true;
}
else if (a % i == 0){
isPrime = false;
}
}
if (isPrime == true)
count++;
}
return count;
}
答案 0 :(得分:3)
在您的内部<select name="SELECT1" id="select1" class="Assessment">
<option value="0">OPTION 1</option>
<option value="1" selected>OPTION 2</option>
</select>
<select name="select2" id="select2" class="Assessment">
<option value="0">OPTION 1</option>
<option value="1">OPTION 2</option>
<option value="2" selected>OPTION 3</option>
</select>
<select name="select3" id="select3" class="Assessment">
<option value="0">OPTION 1</option>
<option value="1">OPTION 2</option>
<option value="2" selected>OPTION 3</option>
</select>Score:
<input type="text" name="ScoreTot" id="ScoreTot" value="">
循环中,您正在设置for
,但随后您将继续循环播放。如果候选除数isPrime
没有干净地划分,则后续循环可以将isPrime
设置为false
。只有i
,2
和3
,您的第一个5
条件中的3个数字始终将其设置为if
,因此您总是得到{{1} }}
相反,在内部true
循环开始时将3
设置为isPrime
,并在每次使用后将true
设置为内部for
循环设置break
。如果数字为2,3或5,则设置为for
和isPrime
,因此无法将其设置为true
,因此您可以对其进行计数。如果您找到了一个因素,则它不是素数,因此设置为break
和false
,因此无法将其设置为false
并且不计算它。
顺便提一下,您的最终break
条件会测试true
;它可以简化为if
。
答案 1 :(得分:1)
您的策略是通过扫描除自身和其他因素之外的因素来测试从2到num
的每个数字的原始性。虽然有点简单,但您的实现严重受损。< / p>
涉及扫描因子的方法意味着您首先猜测被测试的数字是素数,然后去寻找它不是的证据。你已经错过了猜测它的巅峰时期&#34;部分,在您的特定代码中,它将采用在外部循环开头设置isPrime
到true
的形式。
另一方面,在测试isPrime
的情况后,您的代码永远不会将true
重置为a == 5
。在测试false
的情况时,该变量将设置为a == 6
,并且在此期间保持不变。这就是为什么你总是得到任何大于4的输入结果3。
如果在外循环中正确重置isPrime
,那么您也可以删除内循环中条件的第一部分,因为它将是多余的。无论如何,在a == 2
和a == 3
的情况下从未执行过,因为内部循环在这些情况下执行零迭代。
另请注意,一旦确定a
是复合的,并且您运行的循环次数多于您需要为素数进行的迭代,那么从内循环中断会更有效率(它会足够循环,直到i
超过a
的平方根;也就是说,直到i * i > a
)。
最后,请注意,只要您要测试的数字不是那么大,以至于所需的数组将是Seive of Eratosthenes(或其他素数的其中一个),这个问题会更有效地实现。非常大。
答案 2 :(得分:1)
#include <iostream>
using namespace std;
int numberOfPrimes(int num)
{
if(num==2)
return 1;
else if(num<2)
return 0;
int prime=1;
for(int i=3;i<=num;i++)
{
for(int j=2;j<=(i/2)+1;j++)
{
if(i%j==0)
break;
if(j==(i/2)+1)
prime++;
}
}
return prime;
}
答案 3 :(得分:0)
package com.amit.primenumber;
公共类PrimeNumber {
public static void main(String[] args) {
long number=23L;
String message=null;
PrimeNumber primeNumber = new PrimeNumber();
boolean result = primeNumber.primeNumber(number);
if(result){
message="a Prime Number";
}else{
message="Not a Prime Number";
}
System.out.println("The given "+number+" number is "+message);
}
public boolean primeNumber(long number){
for(long i=2;i<=number/2;i++){
if(number%i==0){
return false;
}
}
return true;
}
}
答案 4 :(得分:-1)
package basics;
public class CheckPrimeOrNot {
public void checkprimeNumber(int i){
int flag=0;
if(i>2){
for(int j = 2; j <= i/2; j++){
if(i%j == 0){
System.out.println("Given number is Not Prime");
flag=1;
break;
}
}
if(flag==0){
System.out.println("Given number is Prime");
}
} else{
System.out.println("Please enter a valid number");
}
}
public static void main(String[] args) {
CheckPrimeOrNot CheckNumber = new CheckPrimeOrNot();
CheckNumber.checkprimeNumber(11);
CheckNumber.checkprimeNumber(0);
CheckNumber.checkprimeNumber(250365);
CheckNumber.checkprimeNumber(1231);
}
}