1. 程式人生 > >找素數的Eratosthenes演算法(篩選法)

找素數的Eratosthenes演算法(篩選法)

關於Eratosthenes演算法的介紹點選 Eratosthenes 篩選求質數。下面是其程式碼實現

package day03;

public class TestJava {
	public static void main(String[] args) {
		TestJava java = new TestJava();
		
		//System.out.println(java.power(2, 12));
		//java.hanuota('A', 'B', 'C', 3);
		//System.out.println(java.gcd(12, 36));
		//java.printPrime2(10, 1000);
		java.printPrime(100);
	}
	
	//找出小於n的所有素數,Eratosthenes演算法
	public void printPrime(int n) {
		boolean[] primes = new boolean[n + 1];
		for (int i = 0; i < primes.length; i++) {
			primes[i] = true;
		}
		
		for (int i = 2; i <= n / i; i++) {
			if (primes[i]) {
				for (int j = i; j <= n / i; j++) {
					primes[i * j] = false;
				}
			}
		}
		
		int count = 0;
		for (int i = 2; i <= n; i++) {
			if (primes[i]) {
				count++;
				if (count % 10 == 0) {
					System.out.printf("%5d\n", i);
				}
				else {
					System.out.printf("%5d", i);
				}
			}
		}
	}
	
	//找出[m, n)區間的所有素數
	public void printPrime2(int m, int n) {
		if (m < 2 || n <= m) {
			return;
		}
		
		int outputNums = 0;
		for (int i = m; i < n; i++) {
			boolean isPrime = true;
			int endN = (int) Math.sqrt(i);
			for (int k = 2; k <= endN; ++k) {
				if (i % k == 0) {
					isPrime = false;
				}
			}
			
			if (isPrime == true) {
				System.out.print(i + " ");
				if (++outputNums % 10 == 0) {
					System.out.println();
				}
			}
		}
	}
	
	// 最小公約數
	public int gcd(int m, int n) {
		while (n != 0) {
			int r = m % n;
			m = n;
			n = r;
		}
		return m;
	}
	public int gcd2(int m, int n) {
		return n == 0 ? m : gcd2(n, m % n);
	}
	
	// a的n次方
	public int power(int a, int n) {
		if (n <= 0) {
			return 1;
		}
		
		if (n % 2 == 0) {
			return power(a * a, n / 2);
		}
		else {
			return (a * power(a * a, n / 2));
		}
	}
	
	// 漢諾塔問題
	private int i = 1;
	public void hanuota(char a, char b, char c, int n) {
		if (n == 1) {
			System.out.println(this.i++ + ": " + a + "->" + c);
		}
		else {
			hanuota(a, c, b, n - 1);
			System.out.println(this.i++ + ": " + a + "->" + c);
			hanuota(b, a, c, n - 1);
		}
	}
}

相關推薦

素數Eratosthenes演算法(篩選)

關於Eratosthenes演算法的介紹點選 Eratosthenes 篩選求質數。下面是其程式碼實現 package day03; public class TestJava { public static void main(String[] args) { T

打表解素數問題(篩選

1、最大素因子 #include<stdio.h> #define max 1000010 int a[max]={0}; void num_prime() {     int i,j,x=0;     for(i=2;i<max;i++)     {  

演算法】3.Eratosthenes篩選與尤拉篩選素數

Eratosthenes篩法 1.原理 一個合數可以分成幾個素數的和,如果把素數(最初只知道2)的倍數全都去掉,剩下的就都是素數了 2.思路分析 去除0,1(既不是素數又不是合數) 找到佇列中最小的素數,刪除其倍數 3.程式碼實現(只給出了函

質數演算法之埃拉托色尼篩選(Sieve of Eratosthenes演算法

一、演算法原理 一個合數總是可以分解成若干個質數的乘積,那麼如果把質數(最初只知道2是質數)的倍數都去掉,那麼剩下的就是質數了。 二、步驟 (1)先把1刪除(1既不是質數也不是合數) (2)讀取

Eratosthenes篩選素數演算法

public class Sieve{  public static void main(String[] args)  {     int max = 100;  //假設求100以內的素數     boolean[] isPrime = new boolean[max+1

篩選素數

print rgs pre system span clas 篩選法 stat != 1 public class Test01 { 2 3 public static void main(String[] args) { 4 int[]

使用埃拉托色尼篩選(the Sieve of Eratosthenes)在一定範圍內求素數及反素數(Emirp)

Programming 1.3 In this problem, you'll be asked to find all the prime numbers from 1 to 1000. Prime numbers are used in allkinds of circumstances, particu

程式基本演算法習題解析 使用篩選求出1~100之內的所有素數

思路:              第一個素數是2,把後面是2的整數倍的數全部篩去,篩去的數置0;從第一個素數2向後找出最小的未被篩去的數3,把它後面是3的整數倍的數全部篩去並置0;重複上述過程,直到新找到的素數大於1

演算法提高 素數求和 藍橋杯 (篩選

/*  演算法提高 素數求和  問題描述  輸入一個自然數n,求小於等於n的素數之和樣例輸入2樣例輸出2資料規模和約定  測試樣例保證 2 <= n <= 2,000,000*/#include <stdio.h>#include <stdlib

Eratosthenes篩選求小於N的所有素數個數

求出1~N範圍中所有的素數,在leetcode中做過這個題目,我想從對每個1~N進行一次遍歷,每個數判斷一次是否是素數。 判斷一個數是否是素數的複雜度本身也是挺高的,再進行一次迭代,在leetcode中的結果是超時: class Solution { p

篩選素數演算法

篩選法生成質數表(素數表)的基本思想如下: 假設有一個數組存放整數2 ~ N,如下所示: 首先將2的倍數篩去(實際操作時可以將陣列對應的值設定為0),得到: 然後將3的倍數篩去,得到: 再一次將5的倍數篩去,7的倍數篩去,11的倍數篩去......

演算法:埃拉托色尼篩選素數(Python和Java)

來自百度百科–埃拉托色尼篩選法: (1)先把1刪除(現今數學界1既不是質數也不是合數) (2)讀取佇列中當前最小的數2,然後把2的倍數刪去 (3)讀取佇列中當前最小的數3,然後把3的倍數刪去 (4)讀取佇列中當前最小的數5,然後把5的倍數刪去 (5)讀

Eratosthenes篩選素數

文章關鍵字:|Eratosthenes|篩選|素數|  public class Sieve{    public static void main(String[] args)    {      int max = 100; //假設求100以內的素數      bool

藍橋杯-素數篩選

  演算法提高 找素數   時間限制:1.0s   記憶體限制:256.0MB 問題描述   給定區間[L, R] , 請計算區間中素數的個數。 輸入格式   兩個數L和R。 輸

藍橋杯 演算法提高 素數 【思維素數 + 篩

時間限制:1.0s 記憶體限制:256.0MB 問題描述   給定區間[L, R] , 請計算區間中素數的個數。 輸入格式   兩個數L和R。 輸出格式   一行,區間中素數的個數。 樣例輸入 2 11 樣例輸

(轉載)O(N)的素數篩選和歐拉函數

算法與數據結構 變形 技術 範圍 n) border {} 數據 eps 轉自:http://blog.csdn.net/dream_you_to_life/article/details/43883367 作者:Sky丶Memory 1.一個數是否為質數的判定.

素數篩選

return img rim -a clas font clu als bool 素數篩選法 素數(又稱質數):指在大於一的自然數中,只能被1和它自身整除的自然數; 素數篩選法是指一種非常規的素數判定方法,比較高效率; 原理:任何數的整數倍必定不是素數,大於二的

篩選素數

return include main 技術 ret printf int images ima C語言 #include <stdio.h>#include <math.h>int main(){int i,j,a[100],N;scanf("

篩選<求素數表>

spa 素數 表示 fine define pri bsp 遍歷 數組 如果題目的數據規模較大,常規地逐個判斷素數的方法行不通,可以使用篩選法進行預處理,將所有素數一次性求出並存入數組中。 篩選法求素數的主要思想如下: (1)將1~N的所有數都標記為素數,0表示素數,1表

【C語言】 利用篩選求100以內的素數

演算法思路: 原理很簡單,就是當i是質(素)數的時候,i的所有的倍數必然是合數。如果i已經被判斷不是質數了,那麼再找到i後面的質數來把這個質數的倍數篩掉。 程式碼如下: //C語言 篩選法求100以內的素數 //原理很簡單,就是當i是質(素)數的時候,i的所有的倍數必然是合數。如果i已經