程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 挑選法的C++完成

挑選法的C++完成

編輯:關於C++

挑選法的C++完成。本站提示廣大學習愛好者:(挑選法的C++完成)文章只能為提供參考,不一定能成為您想要的結果。以下是挑選法的C++完成正文


挑選法

引見:
挑選法又稱篩法,是求不跨越天然數N(N>1)的一切質數的一種辦法。聽說是古希臘的埃拉托斯特尼(Eratosthenes,約公元前274~194年)創造的,又稱埃拉托斯特尼篩子。

詳細做法是:先把N個天然數順次序分列起來。1不是質數,也不是合數,要劃去。第二個數2是質數留上去,而把2前面一切能被2整除的數都劃去。2前面第一個沒劃去的數是3,把3留下,再把3前面一切能被3整除的數都劃去。3前面第一個沒劃去的數是5,把5留下,再把5前面一切能被5整除的數都劃去。如許一向做下去,就會把不跨越N的全體合數都篩失落,留下的就是不跨越N的全體質數。由於希臘人是把數寫在塗臘的板上,每要劃去一個數,就在下面記以小點,追求質數的任務終了後,這很多小點就像一個篩子,所以就把埃拉托斯特尼的辦法叫做“埃拉托斯特尼篩”,簡稱“篩法”。(另外一種說明是其時的數寫在紙草上,每要劃去一個數,就把這個數挖去,追求質數的任務終了後,這很多小洞就像一個篩子。)

用C++完成挑選法:
以經由過程挑選法求100之內的素數為例

#include<iostream>
using namespace std;
int main()
{
 int i,j,a[101];//這裡界說101年夜小的數組,是為了和天然數絕對應,即:a[2]對應天然數2
 for(i=2;i<100;i++)
     a[i]=1;//完成對數組的初始化操作
 for(i=2;i<100;i++){
  for(j=2*i;j<100;j+=i){
   a[j]=0;//對響應的倍數停止消除
  }
 }
 //履行輸入操作
 for(i=2;i<100;i++){
  if(a[i])
  cout<<i<<'\t';
 }
 cout<<endl;
 return 0;
}

一些思慮和優化
之前進修盤算素數的算法的時刻,有一個比擬廣泛的優化的算法。

也就是用

for(i=1;i<(j/2);i++)

或許

for(i=1;i<sqrt(j);i++)//應用sqrt()函數須要引入math.h這個頭文件

來替換

for(i=1;i<j;i++)

可以明顯的下降算法的龐雜度

一開端直接應用,不曉得是甚麼道理。後來看了看,本來道理是如許的:

以sqrt(j)取代i為例

求素數最根本的辦法,是用i去除以2到j-1之間的一切的整數,假如有可以整除的情形,則不是素數;假如都弗成以整除,則是素數。

而i=sqrt(j)*sqrt(j)

我們用i去除以2到sqrt(j)之間的一切的整數,這便可以籠罩2到i-1之間的一切的整數。

設2<k<sqrt(j),則若j%k==0,則sqrt(j)<m=(j%k)<j-1。

也就是說,由於是除法運算求整除的運算,所以除以小的可以整除,可就是除以響應的年夜的可以整除。

優化以後的代碼:

#include<iostream>
#include<math.h>
using namespace std;
int main()
{
 int i,j,a[101];//這裡界說101年夜小的數組,是為了和天然數絕對應,即:a[2]對應天然數2
 for(i=2;i<100;i++)
     a[i]=1;//完成對數組的初始化操作
 for(i=2;i<sqrt(100);i++){
  for(j=2*i;j<100;j+=i){
   a[j]=0;//對響應的倍數停止消除
  }
 }
 //履行輸入操作
 for(i=2;i<100;i++){
  if(a[i])
  cout<<i<<'\t';
 }
 cout<<endl;
 return 0;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved