簡體   English   中英

素數程序問題

[英]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 只有23 ,和5 ,在你第一次的3個數字if條件下,將其設置為true始終,讓您始終獲得3

相反,設置isPrimetrue在內部的開始for循環,並break了內部的for每次設定的時間后循環isPrime 如果數字是2、3或5,則將其設置為truebreak因此沒有什么可以將其設置為false ,因此可以對其進行計數。 如果找到一個因素,它不是主要因素,因此將其設置為false並使其break因此沒有任何東西可以將其設置為true ,並且不計算在內。

順便說一句,您的最終if條件測試一個boolean 可以簡化為if (isPrime)

您的策略是通過掃描除自身和1以外的因素來測試從2到num每個數字的素數。這雖然可以簡化,但可以實現,但是嚴重破壞了實現。

一種涉及掃描因子的方法意味着您首先要猜測所測試的數字是質數,然后再尋找並非如此的證據。 您已經錯過了“猜測素數”部分,在您的特定代碼中,它將在外部循環開始時采取將isPrime設置為true的形式。

另一方面,在測試a == 5的情況后,您的代碼絕不會將isPrime重置為true 在測試a == 6的情況時,該變量將設置為false ,並且在持續時間內保持不變。 因此,對於任何大於4的輸入,總會得到結果3。

如果您在外部循環中正確重置了isPrime ,那么您也可以在內部循環中刪除條件的第一部分,因為這將是多余的。 無論如何,在a == 2a == 3的情況下,它永遠不會執行,因為在這些情況下,內部循環執行零次迭代。

還要注意的是,一旦確定a是復合的,則從內部循環中中斷會更有效,並且您對該循環運行的迭代次數比對素數進行的迭代次數要多(直到i超過的平方根a ;即,直到i * i > a )。

最后,請注意,只要您要測試的數字沒有太大到需要的數組過大的程度,可以通過EratosthenesSeive (或其他素數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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM