[英]Prime Number Program Problems
我目前正在开发一个程序,其中用户输入一个数字,该程序将为您提供最多该数字的质数。 尽管没有错误,但是程序始终输出相同的数字: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;
}
在内部for
循环中,您正在设置isPrime
,但随后继续循环。 如果候选除数i
不能很好地划分,则随后的循环可能会将isPrime
设置为false
。 只有2
, 3
,和5
,在你第一次的3个数字if
条件下,将其设置为true
始终,让您始终获得3
。
相反,设置isPrime
到true
在内部的开始for
循环,并break
了内部的for
每次设定的时间后循环isPrime
。 如果数字是2、3或5,则将其设置为true
并break
因此没有什么可以将其设置为false
,因此可以对其进行计数。 如果找到一个因素,它不是主要因素,因此将其设置为false
并使其break
因此没有任何东西可以将其设置为true
,并且不计算在内。
顺便说一句,您的最终if
条件测试一个boolean
; 可以简化为if (isPrime)
。
您的策略是通过扫描除自身和1以外的因素来测试从2到num
每个数字的素数。这虽然可以简化,但可以实现,但是严重破坏了实现。
一种涉及扫描因子的方法意味着您首先要猜测所测试的数字是质数,然后再寻找并非如此的证据。 您已经错过了“猜测素数”部分,在您的特定代码中,它将在外部循环开始时采取将isPrime
设置为true
的形式。
另一方面,在测试a == 5
的情况后,您的代码绝不会将isPrime
重置为true
。 在测试a == 6
的情况时,该变量将设置为false
,并且在持续时间内保持不变。 因此,对于任何大于4的输入,总会得到结果3。
如果您在外部循环中正确重置了isPrime
,那么您也可以在内部循环中删除条件的第一部分,因为这将是多余的。 无论如何,在a == 2
和a == 3
的情况下,它永远不会执行,因为在这些情况下,内部循环执行零次迭代。
还要注意的是,一旦确定a
是复合的,则从内部循环中中断会更有效,并且您对该循环运行的迭代次数比对素数进行的迭代次数要多(直到i
超过的平方根a
;即,直到i * i > a
)。
最后,请注意,只要您要测试的数字没有太大到需要的数组过大的程度,可以通过Eratosthenes的Seive (或其他素数seive之一)来更有效地实现此问题。
我通过减少检查a是2、3或5所需的操作数来简化了代码。
public static int Prime(int num) {
int count = 0;
if (num >= 2) {
count++; // One optimization here
}
for (int a = 3; a <= num; a+=2) { // Another one here as we don't have any even number except 2 :D
boolean isPrime = true;
for (int i = 2; i <= a / 2; i++) {
if (a % i == 0) {
isPrime = false;
break;
}
}
if (isPrime) {
count++;
}
}
return count;
}
#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;
}
包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;
}
}
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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.