題目:求100之內的素數,並每行10個數輸出
程序源代碼:
#include "stdio.h"
#include "math.h"
#define N 101 //可更改自然數範圍
main()
{
int i,j,line,a[N]; //a[N]存放每個自然數,因此也就限定自然數不可能太大
for(i=2;i<N;i++) a[i]=i;
for(i=2;i<sqrt(N);i++)
for(j=i+1;j<N;j++)
{
if(a[i]!=0&&a[j]!=0)
if(a[j]%a[i]==0)
a[j]=0;
}
printf("\n");
for(i=2,line=0;i<N;i++)
{
if(a[i]!=0)
{
printf("%5d",a[i]); //每個數輸出佔5位,右對齊
line++;
}
if(line==10) //每行10個數輸出
{
printf("\n");
line=0;
}
}
printf("\n");
}
埃拉托色尼篩法(從自然數找出質數的方法)
法一:
int Prime(int *p, int n)
{
int i,j,count=0;
for(i=2; i<=n; i++){
if(a[i]==0){
p[count++]=i;
for(j=2;i*j<=n;j++){
a[i*j]=1;
}
}
}
return count;
}
法二:
int Prime(int *p,int m)
{
int a[120001]={0};
int i,j,count=0;
for(i=2;i<2*m+1;i++) a[i]=1; //a數組標記是否爲素數,1表示是素數
for(i=0;i<2*m+1;i++)
{
if(a[i]==1){
p[count++]=i; //p數組用來存放素數
for(j=i;j<2*m+1;j+=i) a[j]=0; //將素數的倍數在a中標記爲0
}
}
return count;
}
從自然數找出質數的方法,說簡單些,就是依次寫出2,3,4,5,…,N,留下第一個數2,之後每隔兩個數劃去一個數(也就是篩去2的倍數): 剩下2以後的第一個沒有被篩去的質數是3,把3留下,劃去以後的3的倍數: 剩下3以後的第一個沒有被篩去的質數是5,留下5,再把5以後的5的倍數的數劃去。如此一直做下去,一直到小於等於N的開方的質數都篩去得到的就是小於等於N的質數