演算法:埃拉托色尼篩選法求素數(Python和Java)
來自百度百科–埃拉托色尼篩選法:
(1)先把1刪除(現今數學界1既不是質數也不是合數)
(2)讀取佇列中當前最小的數2,然後把2的倍數刪去
(3)讀取佇列中當前最小的數3,然後把3的倍數刪去
(4)讀取佇列中當前最小的數5,然後把5的倍數刪去
(5)讀取佇列中當前最小的數7,然後把7的倍數刪去
(6)如上所述直到需求的範圍內所有的數均刪除或讀取
#Python
def _int_iter():#定義生成器生成大於三的奇數
n = 1;
while True:
n=n+2;
yield n;
def _int_iter(n) :#定義過濾器過濾保留符合條件的
return lambda x:x%n>0
def prime():
it = _int_iter();
while True:
next(it);
yield n;
it = filter(_int_iter(n),it)#獲得新序列
for n in primes(): # 構造迴圈條件,使之可以輸出任何範圍的素數序列
if n < 100: #取100以內的素數
print(n)
else:
break
這段程式碼較好理解主要通過生成器生成序列,過濾器保留符合條件的數字
方法一使用乘的方式:
int N = 100;
boolean[] a = new boolean[N];
for (int i = 2; i < N; i++) {
a[i] = true;
}
for (int i = 2; i < Math.sqrt(N); i++) {//獲取N的平方根由於N以後的數計算就重複了
if (a[i] != false) {
for (int j = i; j * i < N; j++) {
a[i * j] = false ;//排除i和比i大的數相乘後的數--這類似於99乘法表可以保證每個數都可以乘到
}
}
}
int cnt=0;
for (int i = 2; i < N; i++) {
if (a[i]) {
cnt++;
System.out.println(i);
}
}
System.out.println(N+"以內的素數有"+cnt+"個");
}
java的主要思路是通過素數的性質:一個大於1的正整數,如果除了1和它本身以外,不能被其他正整數整除,就叫素數,換句話說也就是大於1的正整數相乘後的數一定不會是素數
方法二:使用除的方式
public class Pratice_prime_numbe {
public static void main(String[] args) {
int N = 100;
boolean[] a = new boolean[N];
for (int i = 2; i < N; i++) {
a[i] = true;
}
for (int i = 2; i < Math.sqrt(N); i++) {//獲取
for(int j = i+1 ; j<N;j++){
if (a[i] && j%i==0){
a[j]=false;
}
}
}
int cnt=0;
for (int i = 2; i < N; i++) {
if (a[i]) {
cnt++;
System.out.println(i);
}
}
System.out.println(N+"以內的素數有"+cnt+"個");
}
}
相關推薦
演算法:埃拉托色尼篩選法求素數(Python和Java)
來自百度百科–埃拉托色尼篩選法: (1)先把1刪除(現今數學界1既不是質數也不是合數) (2)讀取佇列中當前最小的數2,然後把2的倍數刪去 (3)讀取佇列中當前最小的數3,然後把3的倍數刪去 (4)讀取佇列中當前最小的數5,然後把5的倍數刪去 (5)讀
埃拉托色尼篩選法-求素數
// 埃拉托色尼篩選法- 求素數 void getprimes(int n) { int result[n]; for (int i = 0; i < n; ++i) { result[i] = i + 1; }
HDU Largest prime factor(埃拉托色尼篩選法求素數模板法改動)
題意:給你一個數,求它這個數的最大素因子在素數表的第幾位 思路:剛開始思路有一點錯誤,看錯誤程式碼 錯誤程式碼: #include <iostream>0 #include <cs
找質數演算法之埃拉托色尼篩選法(Sieve of Eratosthenes演算法)
一、演算法原理 一個合數總是可以分解成若干個質數的乘積,那麼如果把質數(最初只知道2是質數)的倍數都去掉,那麼剩下的就是質數了。 二、步驟 (1)先把1刪除(1既不是質數也不是合數) (2)讀取
使用埃拉托色尼篩選法(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到
【python學習筆記】46:隨機漫步,埃拉托色尼篩法,蒙特卡洛演算法,多項式迴歸
學習《Python與機器學習實戰》和《scikit-learn機器學習》時的一些實踐。 隨機漫步 import matplotlib.pyplot as plt import numpy as np ''' 一維隨機漫步 ''' # 博弈組數 n_person = 20
埃拉托色尼素數篩選法的證明及原理
一、什麼是素數? 素數又稱為質數。素數定義為在大於1的自然數中,除了1和它本身以外不再有其他因數。素數在日常中最多的應用就是加密演算法,例如RSA加密演算法就是基於來實現的。RSA演算法會隨機生成兩個1024位的質數相乘,要破解密碼必須對乘積做質因數分解,而1024位的質因數分解是非常困難的。 二、如
埃拉托色尼質數篩法
一次 i++ das code sin ostream turn 算法 oid 所謂質數的篩法,就是在一個給定的區間中判斷哪些數是質數,哪些數不是質數 這是OI常用質數篩選方法的第一種——Eratosthnes 用到的性質是 質數的倍數一定不是質
關於用埃氏篩選法求素數python程式碼的一些理解
原始碼 來自廖雪峰-filter 演算法描述參考原文。 程式碼塊如下: def _odd_iter(): # 生成一個無限序列的奇數Generator z = 1 while True: z = z+2 yield z def
【演算法】3.Eratosthenes篩選法與尤拉篩選法求素數
Eratosthenes篩法 1.原理 一個合數可以分成幾個素數的和,如果把素數(最初只知道2)的倍數全都去掉,剩下的就都是素數了 2.思路分析 去除0,1(既不是素數又不是合數) 找到佇列中最小的素數,刪除其倍數 3.程式碼實現(只給出了函
篩選法求素數演算法
篩選法生成質數表(素數表)的基本思想如下: 假設有一個數組存放整數2 ~ N,如下所示: 首先將2的倍數篩去(實際操作時可以將陣列對應的值設定為0),得到: 然後將3的倍數篩去,得到: 再一次將5的倍數篩去,7的倍數篩去,11的倍數篩去......
Eratosthenes篩選法求素數的演算法
public class Sieve{ public static void main(String[] args) { int max = 100; //假設求100以內的素數 boolean[] isPrime = new boolean[max+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("
篩選法求素數 java
思路:在一個boolean型別的陣列中 ,從第二個開始遍歷,將2的倍數置為false,3的倍數置為false。例項說明一下: 求0-10的素數,定義陣列boolean b[]=boolean[11];
埃氏篩法求素數-Python
def _not_divisible(n): #是否整除 return lambda x: x%n > 0 def _odd_iter(): #建立奇數序列 n = 1 while True: n += 2 y
1089 習題6-1 篩選法求素數
題目描述從鍵盤上輸入一個正整數N(N<=100),用篩選法求N之內的素數輸入正整數N輸出0~N之間的素數,每個素數一行樣例輸入100樣例輸出2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83
Eratosthenes篩選法求素數
文章關鍵字:|Eratosthenes|篩選|素數| public class Sieve{ public static void main(String[] args) { int max = 100; //假設求100以內的素數 bool
C++篩選法求素數(簡單)
篩選法求素數經常是求解其他問題的前提 程式碼: #include <bits/stdc++.h> using namespace std; const int N = 10000
篩選法求素數(三種)
第一種:剔除2 3 4 5 6 ... ... 的倍數 在i從2開始的增一變化過程中,剔除i的倍數即j*i(j是大於等於2的自然數,j的上限是問題規模M) 為了減少重複步驟,可以每當i遞增到等於第一個沒有被剔除的(素)數時再剔除該數的倍數, 重複上述過程至i到達問題規模