先上開根號求素數
乙個數n的最小質因子,必定小於開根號n:
數學表達:a*b=n,若a《開根號n,b必定》開根號n,所以只要求2~開根號n,即可判斷n是不是素數。
反證法如果數n的最小質因子a大於開根號n,那數n的另乙個因子b,(b和a構成一對n的約數),
必定大於a,那麼也大於根號n,
這時候,a*b必定大於n,所以原命題正確
自己的證明:乙個數n,那麼有 0~開跟號n=>左域 ,開根號n~n-1=>右域。
開根號n就在中間了,開根號n*開根號n=n,這個是最平衡的組合了。
假設n=a*b。a和b!=開根號n,那麼 a和b必定乙個在左域,乙個在右域。
如果a和b都取值於左域,那麼a*b必定 如果a和b都取值於右域,那麼a*b必定》n
所以原命題成立。
**過於簡單,這裡就不貼出來了,只講述原理。
埃氏法求素數
eratosthenes篩選法求解質數
思路:用一句形象的話來形容這個演算法,就是一山難容二虎。例如,2是乙個質數,那麼他可以留在質數表裡面,
那麼,如果2後面的數能夠被2整除的,肯定就不是素數,所以剔除之。(只要前面的有乙個質數【第1虎】,後面為他的倍數的數就肯定不是素數【第2虎】根據素數的定義)
/* note:your choice is c ide */
#include "stdio.h"
/*//優化前的埃氏演算法主要有1個缺點
//1.求素數倍數的時候,是乙個乙個得求,(比如求2的倍數的時候,是直接從2開始,然後乙個乙個往上加,一直求到n),所以它所檢測過數是乙個連續的序列
//void main()
for(n=2;n<=100;n++)} }
}for(n=1;n<=100;n++)
}}*///優化後的埃氏演算法,主要優化2點
//1.求6的倍數,不從2開始乘,(既2*6,因為前面算2的時候,已經算過了),直接從6*6開始
//2.對求過的數進行判斷,如果已經不是素數了,就直接跳過
//對比優化之前的埃氏演算法,檢測素數倍數的時候,是以點的方法去算,優化之前是以乙個連續的序列去算的(比如求2的倍數,優化之前是從2一直加到n-1。優化後的是直接用 2*2 2*3 2*4 ····2*n 《n,)優化後的埃氏演算法,求素數的所檢測過的數是乙個乙個點,那效果肯定比之前的一大串串行好
void main()
for(i=2;i<=100;i++)
} } }
for(i=1;i<=100;i++)}}
先介紹一下尤拉篩選的原理:
假設prime陣列現在存放著i之前的素數。
i=6 ,prime=2,prime=3,prime=5;
如果,i%prime=0,那麼(i*prime)%prime必定也會定於0;
換成具體數字,6%2=0;(6*3)%2=0
因為,i能整除prime,說明prime是i的因子。那不管i乘以多少,結果必定能夠整除prime;
也就是說,當未來i跳到9的時候,2*9,會再次進行一次篩選,那麼就存在冗餘了。
下面介紹整個演算法的流程
for(i=>2~n)
也就是說,不管i是不是素數。先把i*prime篩選出來。
如果這個數是素數,那麼就直接把i之前的素數跟他相乘,得出來的數標記為素數。
如果這個數是合數,那麼就根據上面介紹的原理對i進行處理。
如果i不是素數,那麼他必定能整除prime【0-top】(既當前的已經篩選出來的素數,也就是i之前的素數。)中的某乙個素數。
/* note:your choice is c ide */
#include "stdio.h"
int p[10000];
int prime[10000];
int n=100;
void main()
for(j=0;j
線性篩法求素數(埃氏篩法 尤拉篩法)
篩法都是初始化把所有數都先設為素數,然後篩除合數。理解起來比較簡單,就是從小到大的列舉每乙個數,標記它的所有倍數都是合數 非素數 放到u i 為false,u中的下標對應的就是這個數的值。bool u maxn int num,su maxn 1.埃氏篩法 void prime 從小到大的篩選素數,...
快速求素數表 埃氏篩法與尤拉篩法
尤拉篩法 素數的定義 素數就是除了1和本身之外沒有其他的約數,所以有約數的都不是素數。因此,埃氏篩法的思想就是 先去掉2的倍數,再去掉3的倍數,再去掉4的倍數,依此類推,直到最大數小於最後乙個標出的素數的平方,那麼剩下的序列中所有的數都是素數。o nloglogn 時間複雜度的證明戳此鏈結 incl...
篩選素數的三種方法 包含尤拉篩
具體方法的介紹可以看下面詳細 有注釋 選出素數方法 include include include include include using namespace std const int maxn 1010 方法1 試除法 bool s prime int a return true 方法2 埃...