埃拉托色尼(Eratosthenes)篩法

 用篩選法求1—100以內的素數(此法難度的話,方法能夠不界定:能完成求1—100以內的素數便可)。
 
在一張紙上寫上1到100所有整數,而後逐個判斷它們是不是素數,找出一個非素數,就把它挖掉,最後剩下的就是素數。
 
具體作法以下:
  先將1挖掉(由於1不是素數,可將該數置爲0)。
  用2去除它後面的各個數,把能被2整除的數挖掉,即把2的倍數挖掉。
  用3去除它後面的各數,把3的倍數挖掉。
  分別用四、5各數做爲除數去除這些數之後的各數。
  這個過程一直進行到在除數後面的數已全被挖掉爲止。
  例如找1~50的素數,要一直進行到除數爲49爲止(事實上,能夠簡化,若是須要找1~n範圍內素數表,只需進行到除數爲n^2(根號n),取其整數便可。例如對1~50,只需進行到將50^2做爲除數便可。)
  如上算法可表示爲:挖去1;  a[1]=0用剛纔被挖去的數的下一個數p去除p後面各數,把p的倍數挖掉;
  for(i=2;i<=sqrt(100);i++){  
    for(j=i+1;j<=100;j++)
              if(a[j]%a[i]==0)
                 a[j]=0;
        }
檢查p是否小於n^2的整數部分(若是n=1000,則檢查p),若是是,則返回(2)繼續執行,不然就結束;<4>紙上剩下的數就是素數。
#include<stdio.h>  
#include<math.h>
int main()  
{  
    //cout<<"100之內的所有素數:"<<endl;  
      printf("100之內的所有素數: \n");
      
    int i,j,k;  
    int a[101];  
    for(i=1;i<=100;i++)   a[i]=i;    
    a[1]=0;               //先挖掉a[1]  
  
    for(i=2;i<sqrt(100);i++){  
        for(j=i+1;j<=100;j++){  
            if(a[i]!=0&&a[j]!=0){  
                if(a[j]%a[i]==0){  
                    a[j]=0;           //把非素數挖掉,不是素數的都賦值爲0  
                }  
            }  
        }  
    }  
    printf("\n"); 
    for(i=1,k=0;i<=100;i++){  
        if(a[i]!=0){              //選出值不爲0的數  即素數   
            //cout<<" "<<a[i];  
            printf("%d ",a[i]);
            k++;  
        }  
  
        if(k==10){      //輸出10個數後換行  
            printf("\n"); 
            k=0;  
        }  
    }  
    printf("\n"); 
  
    return 0;  
} 
相關文章
相關標籤/搜索