1. 程式人生 > >java中求素數的幾種方法彙總及比較

java中求素數的幾種方法彙總及比較

首先來看兩道題目:
1. 請實現一個函式,對於給定的整型引數 N,該函式能夠把自然數中,小於 N 的質數,從小到大打印出來。比如,當 N = 10,則打印出:2 3 5 7**重點內容**
2. 請實現一個函式,對於給定的整型引數 N,該函式能夠從小到大,依次打印出自然數中最小的 N 個質數。比如,當 N = 10,則打印出:2 3 5 7 11 13 17 19 23 29

解題思維:

  • 思想一:試除法
    要判斷X是否為質數,就從2一直嘗試到x-1的做法效率是最差的! 其實只要從2一直嘗試到√x,就可以了。因為因數都是成對出現的。比如,100的因數有:1和100,2和50,4和25,5和20,10和10。看出來沒有?成對的因數,其中一個必然小於等於100的開平方,另一個大於等於100的開平方。
  • 思想二:篩選法
    首先,2是公認最小的質數,所以,先把所有2的倍數去掉;然後剩下的那些大於2的數裡面,最小的是3,所以3也是質數;然後把所有3的倍數都去掉,剩下的那些大於3的數裡面,最小的是5,所以5也是質數……上述過程不斷重複,就可以把某個範圍內的合數全都除去(就像被篩子篩掉一樣),剩下的就是質數了。
    聰明的程式猿會構造一個定長的布林型容器(通常用陣列)。比方說,質數的分佈範圍是1,000,000,那麼就構造一個包含1,000,000個布林值的陣列。然後把所有元素都初始化為true。在篩的過程中,一旦發現某個自然數是合數,就以該自然數為下標,把對應的布林值改為false。全部篩完之後,遍歷陣列,找到那些值為true的元素,把他們的下標打印出來即可。
    但是對於需求2,就難辦了。因為需求2給出的 N,表示需要列印的質數的個數,那麼這 N 個質數會分佈在多大的範圍捏?這可是個頭疼的問題啊。
      稍微懂點數學的,應該知道素數的分佈是越往後越稀疏。或者說,素數的密度是越來越低。而素數定理,說白了就是數學家找到了一些公式,用來估計某個範圍內的素數,大概有幾個。在這些公式中,最簡潔的就是x/ln(x),公式中的 ln 表示自然對數(估計很多同學已經忘了啥叫自然對數)。假設要估計1,000,000以內有多少質數,用該公式算出是72,382個,而實際有78,498個,誤差約8個百分點。該公式的特點是:估算的範圍越大,偏差率越小。
    有了素數定理,就可以根據要列印的質數個數,反推出這些質數分佈在多大的範圍內。因為這個質數分佈公式有一定的誤差(通常小於15%)。為了保險起見,把反推出的素數分佈範圍再稍微擴大15%,應該就足夠了。
package com.ying.keepup;

import java.util.Scanner;

public class suShu {
    public static void main(String[] args) {
        boolean flag;
        System.out.println("請輸入m:");
        Scanner sc = new Scanner(System.in);
        int m=sc.nextInt();
//      從2開始一直迴圈到m
        for(int i=2;i<m;i++){
            flag=false
; for(int j=2;j<=Math.sqrt(i);j++){ if(i%j==0){ flag=true; //如果有一個數除得斷則這個數就不是質數 break; } } // 所有的都除不斷後就是質數 所以輸出 if(flag==false){ System.out.print(i+" "); } } } }

相關推薦

java素數方法彙總比較

首先來看兩道題目: 1. 請實現一個函式,對於給定的整型引數 N,該函式能夠把自然數中,小於 N 的質數,從小到大打印出來。比如,當 N = 10,則打印出:2 3 5 7**重點內容** 2. 請

js遍歷陣列的方法彙總

1、forEach  var arr= ['張三', '李四', '王五']; arr.forEach(function(v,k) { console.log(v); //這樣就會分別將name遍歷出來 }); //注意:jquery中each方法是反的,比如: $(arr

JAVA 陣列的排序方法

1、陣列的氣泡排序 public void bubbleSort(int a[]) { int n = a.length; for (int i = 0; i < n - 1; i++) { for (int j = 0; j &

Java去除字串空格的方法

1.直接上程式碼 package com.examplezhc.demo; import android.os.Bundle; import android.app.Activity; public class MainActivity extends Activity

C#/.NET刪除指定資料夾下所有檔案和資料夾的方法彙總

我們知道,在C#/.NET中的System.IO名稱空間下,都是關於檔案和資料夾資訊操作的類。如果在開發中有刪除指定資料夾下所有檔案和資料夾這樣的需要,應該如何使用C#/.NET來實現這個需求呢?方法一:直接刪除整個指定資料夾使用使用Directory.Delete("資料

Javascript迴圈刪除陣列元素的方法示例

發現問題 大家在碼程式碼的過程中,經常會遇到在迴圈中移除指定元素的需求。按照常規的思路,直接一個for迴圈,然後在迴圈裡面來個if判斷,在判斷中刪除掉指定元素即可。但是實際情況往往不會像預想的那樣順利執行。 下面以一段Javascript程式碼為例演示這一過程。

Java讀取檔案的方法

public class ReadFromFile { /** * 以位元組為單位讀取檔案,常用於讀二進位制檔案,如圖片、聲音、影像等檔案。 */ public static void readFileByBytes(String fileName) { Fil

js繼承的方法

繼承就是子能夠用父的東西,下面直接進入正題: 例項層面上的繼承: 1.淺拷貝: var person={ name:"cj", age:'22', add:{ c:"33", d:'44' } } var

Win7系統開啟服務管理介面的方法彙總

轉自:https://www.jb51.net/os/windows/318465.html Win7服務管理包含了計算機作業系統和應用程式提供的所有服務,但是這麼多服務並非總是使用者所需的。比如印表機服務,如果沒有接入印表機裝置,它的啟動就沒有了意義。   因此,我們可以通過禁用那些用不到的服務來加快開

Mybatis,當插入資料後,返回最新主鍵id的方法具體用法

                一、前言                                     資料庫操作怎能少了INSERT操作呢?下面記錄MyBatis關於INSERT操作的筆記,以便日後查閱。二、 insert元素 屬性詳解                              其

Javasuper的用法並與this的區別

1. 子類的建構函式如果要引用super的話,必須把super放在函式的首位. class Base { Base() { System.out.println("Base"); } } public class Checket extends Base {

Java定時任務的方法(Thread 和 Timer,執行緒池)

/**   * 普通thread   * 這是最常見的,建立一個thread,然後讓它在while迴圈裡一直執行著,   * 通過sleep方法來達到定時任務的效果。這樣可以快速簡單的實現,程式碼如

java寫入檔案的方法分享

原博:https://www.jb51.net/article/47062.htm 一,FileWritter寫入檔案 FileWritter, 字元流寫入字元到檔案。預設情況下,它會使用新的內容取代所有現有的內容,然而,當指定一個true (布林)值作為FileWritter建構函式的第二

java常用的快取型別介紹

在平時的開發中會經常用到快取,比如locache、redis等,但一直沒有對快取有過比較全面的總結。下面從什麼是快取、為什麼使用快取、快取的分類以及對每種快取的使用分別進行分析,從而對快取有更深入的瞭解。 1.什麼是快取 在使用快取前我們應該瞭解什麼是快取,下面是維基百科上面對於快取的定義:

Java建立物件的方法

有時候,也可能碰到這樣面試題,如: Java建立物件有哪幾種方法? 除了new之外,java建立物件還有哪幾種方式? 本文結合例子,給出幾種Java建立物件的方法,Here we go~~~~ 使用new建立 這是最常用的一種。如: Book b

Java定義常量方式

在開發中定義常量是很常見的事,但常量定義有哪幾種方式可選?各種定義方式有什麼優缺點?咱們就用這篇小文來梳理下^_^ 1.通過介面Interface來定義(不推薦) 定義方式如下: 我們可以這樣使用它: 這種定義方式的優點: 適合懶人使用,為什麼呢?

JAVA常用的設計模式--單例

前段時間面試的時候被問到了設計模式,結果想想只瞭解單例、工廠…囧,所以整理下,溫故而知新。 設計模式:簡單說就是前人留下的一些經驗,有助於提高程式碼的複用率,增加可讀性; 單例模式應該是使用比較多的模式之一,很多人都是一知半解,其中也包括我,哈

Java常見的RuntimeException

總結了一下JAVA中常見的幾種RuntimeException,大約有如下幾種: NullPointerException - 空指標引用異常 ClassCastException - 型別強制轉換異常。 IllegalArgumentException - 傳遞非法引數異常。 ArithmeticExc

java呼叫webservice介面 方法

webservice的 釋出一般都是使用WSDL(web service descriptive language)檔案的樣式來發布的,在WSDL檔案裡面,包含這個webservice暴露在外面可供使用的介面。今天搜尋到了非常好的 webservice provide

awk引用shell變數的方法

一:"'$var'" 這種寫法大家無需改變用'括起awk程式的習慣,是老外常用的寫法.如: var="test" awk 'BEGIN{print "'$var'"}' 這種寫法其實就是把一對單引號分成了兩段單引號,中間的shell變數直接按照shell變數的引用