其原理是:任何一个大于2的合数都能被拆成两个素数之和,而素数的数量少很多,比起直接整除1到n的数等方法效率更高。
可以通过改变number的值来改变输出素数的个数,而int prime[number] = {2};
这种写法不是所有编译器都支持,不支持的话稍作修改即可。
代码如下,注释里面写清楚了思路:
#include<stdio.h>
int isPrime(int x, int knownPrimes[ ],int numberOfKnowPrimes );
int main(void)
{
const int number = 10; //表示number个素数
int prime[number] = {2}; //定义数组并初始化,prime[0]为2,数组其他元素为0
int count = 1; //之后的代码从prime[1]开始存值
int i = 3; //从3开始判断是不是素数
while( count < number){ //在数组里给number个元素存值
if( isPrime(i,prime,count)){ //调用函数判断是不是素数,不是素数返回0,不会执行判断语句
//着重理解这一行代码,是两个行为的组合
//即给对应的数组元素赋值,并且使得count指向下一个坐标,副作用保证执行顺序不会乱
prime[count++] = i;
}
i++; //遍历,因为有if语句的存在只有素数才会存进数组
}
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 numberOfKnowPrimes )
{
int ret = 1;
int i;
for( i=0; i<numberOfKnowPrimes; i++){
//除数组里的元素,即通过是否整除已有的素数来判断是不是素数
if( x % knownPrimes[i] == 0){
ret = 0;
break;
}
}
return ret;
}