C/C++利用篩選法算素?cái)?shù)的方法示例
什么是求素?cái)?shù)
素?cái)?shù)指的是因子只有1和本身的數(shù)(1不是素?cái)?shù)),求解素?cái)?shù)在數(shù)學(xué)上應(yīng)用非常廣泛,而求解n以內(nèi)的素?cái)?shù)也是我們編程時(shí)常遇到的問(wèn)題,在這個(gè)問(wèn)題上,篩選法求解素?cái)?shù)運(yùn)行得非??臁?/p>
i在2到n-1之間任取一個(gè)數(shù),如果n能被整除則不是素?cái)?shù),否則就是素?cái)?shù)
稱篩法
篩選法又稱篩法,是求不超過(guò)自然數(shù)N(N>1)的所有質(zhì)數(shù)的一種方法。據(jù)說(shuō)是古希臘的埃拉托斯特尼(Eratosthenes,約公元前274~194年)發(fā)明的,又稱埃拉托斯特尼篩子。
具體做法是:
先把N個(gè)自然數(shù)按次序排列起來(lái)。1不是質(zhì)數(shù),也不是合數(shù),要?jiǎng)澣?。第二個(gè)數(shù)2是質(zhì)數(shù)留下來(lái),而把2后面所有能被2整除的數(shù)都劃去。2后面第一個(gè)沒(méi)劃去的數(shù)是3,把3留下,再把3后面所有能被3整除的數(shù)都劃去。3后面第一個(gè)沒(méi)劃去的數(shù)是5,把5留下,再把5后面所有能被5整除的數(shù)都劃去。這樣一直做下去,就會(huì)把不超過(guò)N的全部合數(shù)都篩掉,留下的就是不超過(guò)N的全部質(zhì)數(shù)。因?yàn)橄ED人是把數(shù)寫(xiě)在涂臘的板上,每要?jiǎng)澣ヒ粋€(gè)數(shù),就在上面記以小點(diǎn),尋求質(zhì)數(shù)的工作完畢后,這許多小點(diǎn)就像一個(gè)篩子,所以就把埃拉托斯特尼的方法叫做“埃拉托斯特尼篩”,簡(jiǎn)稱“篩法”。(另一種解釋是當(dāng)時(shí)的數(shù)寫(xiě)在紙草上,每要?jiǎng)澣ヒ粋€(gè)數(shù),就把這個(gè)數(shù)挖去,尋求質(zhì)數(shù)的工作完畢后,這許多小洞就像一個(gè)篩子。)
普通枚舉法:
#include <iostream>
#include <string>
#include <cmath>
#include <cstring>
using namespace std;
bool isPlain(int x){
if(x<2) return false;
else{
for(int i=2;i<x;i++)
{
if(!(x%i))
return false;
}
}
return true;
}
int main()
{
int n;
cin>>n;
int cot=0;
for(int j=0;j<n;j++){
if(isPlain(j)){
cout<<j<<((++cot%7==0)?"\n":"\t");
}
}
}
篩選法:
原始版本:
#include <iostream>
#include <string>
#include <cmath>
#include <cstring>
using namespace std;
int main()
{
int n;
cin>>n;
bool* ans=new bool[n];
memset(ans,true,sizeof(bool)*n);//
ans[0]=false;
ans[1]=false;
for(int i=2;i<n;i++){
if(ans[i]){
for(int j=i*2;j<n;j+=i){//倍數(shù)取整
ans[j]=false;
}
}
}
int col = 0;
for(int i=0;i<n;i++){
if(ans[i]){
cout<<i<<" ";
}
}
return 0;
}
改進(jìn)版本
#include <iostream>
#include <string>
#include <cmath>
#include <cstring>
#include <bitset>
using namespace std;
int main()
{
int n;
cin>>n;
bitset<100000> ans;
ans.set(0);
ans.set(1);
for(int j=2; j<=sqrt(n); j++)
{
for(int i=2*j; i < n; i+=j)
{
ans.set(i);
}
}
int cot=0;
for(int i=0; i<n; i++)
{
if(ans[i]!=1)
{
cout<<i<<((++cot%7==0)?"\n":"\t");
}
}
}
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
關(guān)于PCL出現(xiàn)"無(wú)法找到?pcl_commond.dll?文件程序無(wú)法執(zhí)行"的問(wèn)題及解決方法
這篇文章主要介紹了PCL出現(xiàn)"無(wú)法找到?pcl_commond.dll?文件程序無(wú)法執(zhí)行"的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
C語(yǔ)言必背的一些經(jīng)典程序代碼實(shí)例
C語(yǔ)言是一種高級(jí)編程語(yǔ)言,具有很多優(yōu)點(diǎn),下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言必背的一些經(jīng)典程序代碼,文中通過(guò)詳細(xì)的實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05
關(guān)于移位操作的一點(diǎn)重要說(shuō)明
下面小編就為大家?guī)?lái)一篇關(guān)于移位操作的一點(diǎn)重要說(shuō)明。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12
基于Matlab實(shí)現(xiàn)抖音小游戲蘋(píng)果蛇
最近抖音上蘋(píng)果蛇小游戲大火,為了證明MATLAB無(wú)所不能,咋能不跟風(fēng)做一個(gè)?文中詳細(xì)講解了游戲的實(shí)現(xiàn)步驟,感興趣的小伙伴可以嘗試一下2022-06-06
C++ Cmake的構(gòu)建靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)詳解
這篇文章主要為大家詳細(xì)介紹了C++ Cmake的構(gòu)建靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03
詳解Matlab實(shí)現(xiàn)動(dòng)態(tài)表白圖的繪制
這篇文章主要利用Matlab實(shí)現(xiàn)繪制獨(dú)特的表白動(dòng)圖,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定的幫助,感興趣的小伙伴可以了解一下2022-05-05

