簡體   English   中英

循環和素數

[英]Loops and Prime Numbers

編寫一個程序,提示用戶輸入整數,然后打印出直到該整數的所有質數。 例如,當用戶輸入20時,程序應打印2 3 5 7 11 13 17 19回想一下,如果一個數字不能被除1和它本身之外的任何數字整除,則它是質數。

我正在嘗試編寫此程序,但遇到困難,有人可以告訴我如何編寫此代碼嗎? 這是我寫的,但這是完全錯誤的。

import java.util.Scanner;

public class PrimeNumbers
{
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);

        System.out.print("Enter Integers: ");
        int x;
        int n = in.nextInt();

        for (int i = 2; i < n ; i++)
        {
            x = i;

            if (n % i != 0 && i % x != 0)
            {
                System.out.println(i);
            }
            x--;
        }
    }
}

使用Eratosthenes篩子計算小於或等於N的質數。

%java PrimeSieve 25素數<= 25的數目是9

%java PrimeSieve 100質數<= 100的數量是25

%java -Xmx100m PrimeSieve 100000000 <= 100000000的素數為5761455

%java PrimeSieve -Xmx1100m 1000000000素數<= 1000000000的數目是50847534

110MB和1100MB是您要分配給程序的內存量。 如果您的計算機數量較少,請減小此數字,但可能會阻止您解決非常大的N值的問題。

class PrimeSieve {
    public static void main(String[] args) { 
        int N = Integer.parseInt(args[0]);

        // initially assume all integers are prime
        boolean[] isPrime = new boolean[N + 1];
        for (int i = 2; i <= N; i++) {
            isPrime[i] = true;
        }

        // mark non-primes <= N using Sieve of Eratosthenes
        for (int i = 2; i*i <= N; i++) {

            // if i is prime, then mark multiples of i as nonprime
            // suffices to consider mutiples i, i+1, ..., N/i
            if (isPrime[i]) {
                for (int j = i; i*j <= N; j++) {
                    isPrime[i*j] = false;
                }
            }
        }

        // count primes
        int primes = 0;
        for (int i = 2; i <= N; i++) {
            if (isPrime[i]){ primes++; System.out.print(i+", ");}
        }
        System.out.println("\nThe number of primes <= " + N + " is " + primes);
    }
}

使用此方法檢查給定的int是否為質數。

public static boolean isPrime(int a)
{
    if ( a == 2)
        return true;
    int midpoint = Math.round(a/2);
    for(int i = 2; i < midpoint; i++)
    {
        if(a % i == 0)
            return false;
    }
    return true;
}

說明:循環遍歷所有數字,直到中點和模數,直到遇到0為止。 如果遇到0,則返回false,因為我們知道它不是素數;如果遇到0,則返回true,因為它是素數。
我們循環到中點,因為沒有必要進一步循環。

您可以通過以下方式在循環中實現它

for (int i = 2; i < n ; i++)
{
    if (isPrime(i))
    {
        System.out.println(i);
    }
}

暫無
暫無

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

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