簡體   English   中英

for循環查找素數

[英]for loop finding the prime numbers

我正在嘗試運行此代碼以打印所有小於200萬的素數之和。 這個循環永無止境。 誰能告訴我代碼有什么問題? 不過,似乎可以使用較小的數字。

public static void main(String[] args) {

        long result = 1;

        for(int i=0; i<2000000; i++) {
            if(isPrime(i)) {
                result+= i;
            }
        }
        System.out.println(result);

    }
private static boolean isPrime(long n) {
    boolean result = false;

    for(long i=2; i<(long)Math.sqrt(n); i++) {
        if(n%i == 0) {
            result = false;
            break;
        }
        else result = true;
    }
    return result;
}

isPrime您僅測試除以2:

private static boolean isPrime(long n) {
    boolean result = false;

    for(long i=1; i<n/2; i++) {
        if(n%2 == 0) {
            result = false;
            break;
        }
        else result = true;
    }
    return result;

}

它應該被每個i除以2:

for(long i=2; i<n/2; i++) {
    if(n%i == 0) {
      ...

實際上,在您當前的版本中,奇數n會一直除以2,直到n/2而不是很快停止。 考慮n =21。您正在從1到10除以2,而不是在第三步並退出時被3除。

它不僅給出錯誤的結果,而且花費的時間比return語句所需的時間長得多。

編輯 :為獲得更快的結果,請查看Erathostenes方法的這個篩子:

public static long sumOfPrimes(int n) {

    long sum = 0;

    boolean[] sieve = new boolean[n];
    for(int i = 2; i < Math.sqrt(n); i++) {
        if(!sieve[i]) {
            for(int j = i * i; j < n; j += i) {
                sieve[j] = true;
            }
        }
    }

    for(int i = 2; i < n; i++) {
        if(!sieve[i]) {             
            sum += i;
        }
    }

    return sum;
}

編輯#2 :發現了新版本中的一些錯誤。 這是糾正的一個:

private static boolean isPrime(long n) {
    boolean result = false;

    if(n == 2 || n == 3) return true;

    for (long i = 2; i <= (long) Math.sqrt(n); i++) {
        if (n % i == 0) {
            result = false;
            break;
        } else
            result = true;
    }

    System.out.println(n + " " + result);
    return result;
}

您在isPrime()有一個錯誤

測試應該是:

if(n%i == 0) { ...

您需要從2開始計數,而不是從1開始計數,因為每個數字除以1的余數為零!

另外,無需經過Math.sqrt(n)

您應該將其更改為:

private static boolean isPrime(long n) {
    long max = (long)Math.sqrt(n);
    for (long i = 2; i < max; i++) {
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}

僅供參考,通過此更改,我在PC上測試了該程序,並在不到1秒的時間內完成,得出的結果為143064094810

朴素的isPrime函數每次運行時都必須計算直到i (或至少到sqrt(i) )的所有素數。 確保您的isPrime函數可以緩存其結果!

經過測試且無錯誤的Prime檢查功能

static boolean isPrime(int n) {
    if (n == 1) return false;

    for(int i = 2; i <= n/2; i++)
        if(n % i == 0)
            return false;

    return true;
}

這是使用JOptionPane的Prime的完整程序,即Java GUI

import javax.swing.*;

public class ChkPrime {
    public static void main(String[] args) throws NumberFormatException {
        String str = JOptionPane.showInputDialog(null, "Enter any number: ","Input...", 3);

        try {
            int num = Integer.parseInt(str);


            if (num == 1)
                JOptionPane.showMessageDialog(null, "Your inputed no. " + num + " is not prime.","Error!", 0);

            for(int i = 2; i <= Math.sqrt(num); i++) {
                if(num % i == 0) {
                    JOptionPane.showMessageDialog(null, "Your inputed no. " + num + " is not prime.","Error!", 0);
                    System.exit(0);
                }
            }

            JOptionPane.showMessageDialog(null, "Your inputed no. " + num + " is prime.","Yeh! Got it!", 1);
        }

        catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(null, "Please input numbers...","Error!", 0);
            main(null);
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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