1. 程式人生 > >C語言輸出素數表(1-100)&前100個

C語言輸出素數表(1-100)&前100個

本來是想第二篇做雙鏈表的,今天看C和指標第四章,複習了以下之前做的素數輸出,三種不同方法,結果如下:

1.輸出1-100以內的素數:

//這個比較簡單,不多做介紹,唯一注意的一點是for迴圈截止條件是i<sqrt(n),因為對於一個整數n,其是否為素數,在所有小於其平方根的數已經判斷完畢,沒必要再增加工作量判斷到n-1;
#include<stdio.h>
#include<math.h>
int main()
{
	int n;
	int i;
	int flag=0;
	for(n=2;n<=100;n++)
	{
		flag=0;
		for(i=2;i<=sqrt(n);i++)
		{
			if(n%i==0)
				{
					flag=1;
					break;
				}
		}
		if(flag==0)
			printf("%d ",n);
	}

	return 0;
}

2.同樣,也是輸出1-100以內的素數,這個構造一個數組,將其所有元素初始化為1,表示素數,這時取x從2開始,到100以內做迴圈,若x為素數,即prime[x]!=0,使得每個i*x位置元素置0(prime[i*x]=0),表示為非素數,迴圈結束前x+1。

#include<stdio.h>
int main()
{
	int prime[100];
	int i;
	for(i=0;i<100;i++)
		prime[i]=1;
	int x=2;
	while(x<100)   //是每一個數 x*i x=2->100 
	{
		for(i=2;i*x<100;i++)
		{
			if(prime[x])
			{
				prime[i*x]=0;
			}
		}
		x++;
	}
	for(i=2;i<100;i++)
	{
		if(prime[i])
			printf("%d ",i);
	}
	return 0;
}


3.該方法是輸出100個素數,基本思想是構造一個素數表,利用函式判斷每個數是否能被其之前的素數整除,如果不能,則在素數表內加上該元素,不斷迴圈(while迴圈結束條件是cnt即陣列個數>100)。

#include<stdio.h>
int isprime(int n,int prime[],int maxnumber);

int main()
{
	int prime[100]={2,};	//構造素數表,共100個元素,初始化第一個為2,已知為素數;其餘自動為0; 
	int cnt=1;              //計數; 
	//int count=0; 
	int i=3;                //從3開始; 
	while(cnt<=100)          //cnt是陣列現有素數個數 
	{
		if(isprime(i,prime,cnt)) //判斷i是否為素數 
		{
			prime[cnt++]=i;     //如果是記錄到陣列中,下標加1; 
		}
		i++;                    //下一個數 
	}
	
	for(i=0;i<100;i++)
	{
		if(i%10==0 && i!=0)
			putchar('\n');
		printf("%5d",prime[i]);
	}
	
	return 0;
}

int isprime(int n,int prime[],int maxnumber)
{
	int i;
	for(i=0;i<maxnumber;i++)
	{
		if(n%prime[i]==0)    //判斷能否被素數表中的數整除,如果能,則不是素數 
			return 0;
	}
	
	return 1;
}