簡體   English   中英

素數Java程序

[英]Java Program for Prime numbers

問題

在這個項目中,您將編寫一個Java程序,該程序從標准輸入中讀取一個正整數n,然后打印出前n個素數。 我們說,如果存在整數k使得m = kd,則整數m可被非零整數d整除,即,如果d被均分為m。 等效地,如果將m的整數除以d,則m可被d整除。 我們也可以通過說d是m的除數來表達這一點。 如果正整數p的唯一正數為1和p,則稱其為質數。 此規則的一個例外是數字1本身,它被視為非素數。 非素數的正整數稱為復合。 歐幾里得表明有無限多個質數。 素數和復合序列如下所示:

Primes: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, … 

Composites: 1, 4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 22, 24, 25, 26, 27, 28, … 

有很多方法可以測試數字的素數,但最簡單的方法就是簡單地進行除法運算。 首先將m除以2,如果將其平均除,則m不是質數。 否則,除以3,然后除以4,然后除以5,以此類推。如果發現在任意一點處,m可被2 dm-1范圍內的數字d整除,則停止,並得出m是復合的結論。 否則,得出m為質數的結論。 片刻的想法表明,人們不必對本身是合成數字d進行任何試除。 例如,如果試驗除以2失敗(即余數非零,因此m為奇數),則試驗除以4、6或8或任何偶數也將失敗。 因此,為了測試數字m的素數,只需用小於m的素數進行試除。 此外,不必一直上升到m-1。 只需在2 pm范圍內對m除以質數p進行試驗除法。 為了看到這一點,假設m> 1是復合的。 然后存在正整數a和b,使得1 <a <m,1 <b <m,並且m = ab。 但是如果a> m和b> m,則ab> m,這與m = ab相矛盾。 因此,a或b之一必須小於或等於m。

為了在Java中實現此過程,您將編寫一個帶有以下簽名的名為isPrime()的函數:

static boolean isPrime(int m, int[] P) 

該函數將根據m是質數還是復合數返回true或false。 數組參數P將包含足夠數量的質數以進行測試。 具體來說,在調用isPrime()時,數組P必須包含(至少)2 pm范圍內的所有素數p。 例如,要測試m = 53的素數,必須連續進行2、3、5和7的除法。自11> 53以來,我們不再贅述。 因此,函數調用isPrime(53,P)的前提是P [0] = 2,P [1] = 3,P [2] = 5和P [3] = 7。 由於所有這些除法都會失敗,因此這種情況下的返回值將為true。 與測試m = 143相似,必須進行2、3、5、7和11的除法運算(因為13> 143)。 因此,函數調用的前提是Prime(143,P)為P [0] = 2,P [1] = 3,P [2] = 5,P [3] = 7和P [4] = 11。 在這種情況下,返回值將為false,因為11除以143。函數isPrime()應該包含一個循環,該循環逐步遍歷數組P,進行嘗試除法。 當2嘗試除法成功后,此循環應終止,在這種情況下將返回false,或者直到P中的下一個素數大於m為止,在這種情況下將返回true。 該項目中的函數main()將讀取命令行參數n,分配一個長度為n的int數組,用質數填充該數組,然后根據下面描述的格式將數組的內容打印到stdout。 在函數main()的上下文中,我們將此數組稱為Primes []。 因此,數組Primes []在此項目中扮演雙重角色。 一方面,它用於收集,存儲和打印輸出數據。 另一方面,將其傳遞給函數isPrime()以測試新整數的素性。 每當isPrime()返回true時,新發現的素數將被放置在數組Primes []中的適當位置。 該過程之所以有效,是因為如上所述,測試整數m范圍至m所需的質數,並且在測試m時,所有這些質數(以及更多)將已經存儲在數組Primes []中。 當然,有必要手動初始化Primes [0] = 2,然后使用函數isPrime()對素數進行測試3,4,…。

下面是函數main()中要執行的步驟的概述。

  • 檢查用戶是否正確提供了一個命令行參數,該參數可以解釋為正整數n。 如果命令行參數不是單個正整數,則程序將按照以下示例中的說明打印用法消息,然后退出。
  • 分配長度為n的數組Primes []並初始化Primes [0] = 2。
  • 輸入一個循環,該循環將發現后續的素數並將其存儲為Primes [1],Primes [2],Primes [3],...,Primes [n -1]。 該循環應包含一個內部循環,該循環遍歷連續的整數,並通過調用具有適當參數的函數isPrime()來測試它們的素性。
  • 將Primes []數組的內容打印到stdout,將10打印到由單個空格分隔的行。 換句話說,Primes [0]到Primes [9]將在第1行,Primes [10]盡管Primes [19]將在第2行,依此類推。 請注意,如果n不是10的倍數,則輸出的最后一行將包含少於10個素數。

您的程序將稱為Prime.java,將產生與下面的示例運行相同的輸出。 (通常,%表示Unix提示符。)

% java Prime 
Usage: java Prime [PositiveInteger] 
% java Prime xyz 
Usage: java Prime [PositiveInteger] 
% java Prime 10 20 
Usage: java Prime [PositiveInteger] 
% java Prime 75 
2 3 5 7 11 13 17 19 23 29 
31 37 41 43 47 53 59 61 67 71 
73 79 83 89 97 101 103 107 109 113 
127 131 137 139 149 151 157 163 167 173 
179 181 191 193 197 199 211 223 227 229 
233 239 241 251 257 263 269 271 277 281 
283 293 307 311 313 317 331 337 347 349 
353 359 367 373 379 
% 
3 

如您所見,不合適的命令行參數會生成用法消息,該消息與許多unix命令的用法消息相似。 (嘗試執行不帶參數的more命令以查看此類消息。)您的程序將包括一個具有簽名的名為Usage()的函數。

static void Usage() 

將此消息打印到stderr,然后退出。 因此,您的程序將總共包含三個函數:main(),isPrime()和Usage()。 每個注釋之前都應加一個注釋塊,給出其名稱,其操作的簡短描述以及任何必要的前提條件(例如isPrime()的前提條件。)請參見網頁上的示例。

嘗試的解決方案

class Prime {
    public static void main(String[] args) {
        int num1 = 0;
        int num2 = 0;
        int num3;
        for (num1 = 1; num1 < 101; num1++)
            System.out.println(num1);
        for (num2 = 1; num2 < 101; num1++)
            System.out.println(num2);
        num3 = num2 % num1;
        if (num3 == 0)
            System.out.println("The prime numbers are " + num1);
        else
            System.out.println("The prime numbers are " + (num1 += 1));
    }
}

Ben,看來您正在嘗試的事情遠遠超出了您當前的能力。 從一些簡單得多的問題開始。 與您的老師交談,並考慮參加更基礎的課程。 您似乎既不了解程序應該做什么,也不了解如何編寫可能滿足要求的程序,而我們在這里所說的沒有什么可以克服的-您必須對數學和編程有更多的了解。 我們很樂意為您提供幫助,但是僅在此處編寫程序將無濟於事,並且您離解決方案的建議還很遙遠。 如果這聽起來很刺耳,我感到抱歉。 老實說,我的意思是建設性的。 請繼續使用-但要簡單一些。

您的示例解決方案根本沒有真正遵循問題的規范。 您應該首先專注於編寫static boolean isPrime(int m, int[] P)方法。 該方法所需要做的就是:

  • 遍歷P的內容
  • 如果一個元素將m平均除,則m是合成的-返回false
  • 如果元素的平方大於m ,則m為質數-返回true 從問題描述中聽起來這永遠不會發生, P僅在跨越sqrt(m)邊界之前具有從2到1的質數。
  • 如果已經測試了P所有元素,則m為質數-返回true

之后,您可以編寫main來制作素數數組並使用所描述的循環對其進行構建,最后進行參數檢查並實現static void Usage()函數以在參數無效時調用

暫無
暫無

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

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