[英]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函數可以緩存其結果!
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.