簡體   English   中英

尋找素數

[英]Find Prime Numbers

我試圖從命令行中取兩個 arguments,第一個數字是起點,第二個是之后應該找到多少個素數。 我需要打印與第二個命令參數所說的一樣多的素數。 我不知道如何讓它運行正確的次數,然后找到質數。 這是我嘗試過的:

int values = Integer.parseInt(args[0]);   
int loopAmount = Integer.parseInt(args[1]);

for (int i = 2; i <= loopAmount; i++) {
    loopAmount++;
    if (values % i != 0) {
        values++;
        System.out.println(i);
    }
}

您的主循環應如下所示:

int start = Integer.parseInt(args[0]);

int count = Integer.parseInt(args[1]);

for (int candidate = start, i = 0; i < count; ++candidate) {
    if (isPrime(candidate)) {
        i++;
        System.out.println(candidate);
    }
}

我替換了變量名,以使它們對它們的用途更有意義。

在循環內部,必須實現isPrime方法:如果它接收的參數是素數,則返回true ,否則返回false

如果我理解正確,那么您想找到從X開始的N個素數。代碼應該非常簡單:

int X = Integer.parseInt(args[0]);
int N = Integer.parseInt(args[1]);
int C = 0;
while (C < N)
{
    for(int i=2; i< X; i++)
    {
        if(X % i == 0){
            X++;
            continue;
        }
    }
    System.out.println(X);
    X++;
    C++;
}

優化版本:

// cache already found primes
final List<Integer> primes = new ArrayList<>();

/**
 * Find {@code count} prime numbers starting at {@code start} inclusive
 */
public void findPrimes(int start, int count) {
    for (int i = 2; count > 0; i++) {
        if (isPrime(i) && i >= start) {
            System.out.println(i);
            count--;
        }
    }
}

private boolean isPrime(final int i) {
    int sqrt = (int)Math.sqrt(i);
    for (int prime : primes) {
        if (i % prime == 0) {
            return false;
        }
        if (prime > sqrt) {
            break;
        }
    }
    primes.add(i);
    return true;
}
  1. 我們真的需要檢查除數最多不超過sqrt的除數。
  2. 我們真的只需要找到素數除數,因為任何數字都可以寫成素數的乘積

解決方案

#include <iostream>
using namespace std;

int main() {
    int i, n;
    bool isPrime = true;

    cout << "Enter a positive integer: ";
    cin >> n;

    // 0 and 1 are not prime numbers
    if (n == 0 || n == 1) 
    {
        isPrime = false;
    }
    else
    {
         //algorithm to check for prime numbers
        for (i = 2; i <= n / 2; ++i) 
        {
            if (n % i == 0) 
            {
               isPrime = false;
               break;
            }
         }
    }
    if (isPrime)
        cout << n << " is a prime number";
    else
        cout << n << " is not a prime number";

    return 0;
}

   

暫無
暫無

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

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