找素數(在自然數範圍內)C/C++

題目:求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的質數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章