[英]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.