先定义一个函数 isPrime, 函数的key是x,要寻找的数组是knownPrimes,数组的长度是numberOfKnownPrimes。
如果是素数,ret=1; 反之 ret = 0。
如果 x 可以整除 一个素数,那么x就不是素数。
已知2是第一个素数,故 从 i=3 开始,每一轮将新的素数加入数组。
#include <stdio.h>
int isPrime(int x,int knownPrimes[],int numberOfKnownPrimes);
int main(void)
{
const int number = 10;
int prime[number] = {2};
int count = 1;
int i = 3;
while ( count < number) {
if ( isPrime(i, prime, count)) {
prime[count++] = i;
}
{ //括号内是测试
printf("i=%d \tcnt=%d\t", i, count);
int i;
for ( i=0; i<number; i++) {
printf("%d\t", prime[i]);
}
printf("\n");
}
i++;
}
for ( i=0; i<number; i++) {
printf("%d", prime[i]);
if ( (i+1)%5) printf("\t");
else printf("\n");
}
return 0;
}
int isPrime(int x,int knownPrimes[],int numberOfKnownPrimes)
{
int ret =1;
int i;
for ( i=0; i<numberOfKnownPrimes; i++) {
if ( x % knownPrimes[i] == 0) {
ret = 0;
break;
}
}
return ret;
}
(一个非素数x,一定可以表示成两个数(除了0和x本身以外)的乘积,这两个数必然有一个小于等于x的平方根,故可以使用 sqrt函数去求素数和)
以上是前置作业,下面开始构建素数表!
- 构造n以内的素数表
- 令x=2
- 将2x、3x、4x、直至ax<n 的数标记为非素数
- 令x为下一个没有被标记为非素数的数,重复2;直到所有的数都已经尝试完毕
#include <stdio.h>
int main()
{
const int maxNumber = 25;
int isPrime[maxNumber];
int i , x ;
for (i=0; i<maxNumber; i++) {
isPrime[i] = 1;
}
for (x=2; x<maxNumber; x++) {
if (isPrime[x]) {
for (i=2; i*x<maxNumber; i++) {
isPrime[i*x] = 0;
}
}
}
for (i=2; i<maxNumber; i++) {
if ( isPrime[i] ) { //隐含条件isPrime[i] == 1
printf("%d\t", i);
}
}
printf("\n");
return 0;
}
本文深入探讨了两种生成素数的算法:一是通过递增测试每个整数是否为素数,二是利用筛法构建素数表。介绍了算法的实现细节,并提供了C语言代码示例。
604

被折叠的 条评论
为什么被折叠?



