利用数组求前 n 个质数
要求确定一个数 m 是否是质数,可以用已求出的质数对 m 的整除性来确定。
实例解析
对任意整数 m,如果它不能被小于它的质数整除,则 m 也是质数。引入质数表 primes[],已
求得的质数个数为 pc。求前 n 个质数的过程可用以下算法描述:
[算法]求前 n 个质数
{
primes[0]=2;/*2 是第一个质数*/
pc=1;/*已有一个质数*/
m=3;/*被测试的数从 3 开始*/
while(pc<N)
{
调整 m,使 m 为下一个质数;
primes[pc++]=m;
m+=2;/*除 2 外,其余质数均是奇数*/
}
输出 primes[0]至 primes[pc-1];
}
为调整 m 使它是下一个质数,可按顺序用已求得的质数 primes[k]去测试它对 m 的整除性。
如果 m 能被某个 primes[k]整除,则 m 是合数,让 m 增 2,并重新从第一个质数开始对它测试。
数 m 为质数的条件是存在一个 k,使得 primes[0] 至 primes[k-1]不能整除 m,且“primes[k]*
primes[k]>m”成立。代码描述如下:
k=0;
while(primes[k]*primes[k]<=m)
if(m%prime[k]==0)
{
/*m 是合数*/
m+=2;/*让 m 取下一个奇数*/
k=1;/*不必用 primes[0]=2 去测试 m*/
}
else
k++;/*继续用下一个质数去测试*/
程序代码
#include <stdio.h>
// system("cls");/* 清屏 */
void clrscr(){
system("cls");/* 清屏 */
}
//利用数组求前 n 个质数
#define N 50
int main()
{
int primes[N];
int pc,m,k;
clrscr();
printf("\n The first %d prime numbers are:\n",N);
primes[0]=2;/*2 是第一个质数*/
pc=1;/*已有第一个质数*/
m =3;/*被测试的数从 3 开始*/
while(pc<N)
{
/*调整 m 使它为下一个质数*/
k=0;
while(primes[k]*primes[k]<=m)
if(m%primes[k]==0)
{/*m 是合数*/
m+=2;/*让 m 取下一个奇数*/
k=1;/*不必用 primes[0]=2 去测试 m,所以 k 从 1 开始*/
}
else
k++;/*继续用下一个质数去测试*/
primes[pc++]=m;
m+=2;/*除 2 外,其余质数均是奇数*/
}
/*输出 primes[0]至 primes[pc-1]*/
for(k=0;k<pc;k++)
printf("%4d",primes[k]);
printf("\n\n Press any key to quit...\n ");
getch();
return 0;
}