浙大c语言设计第八章8.2第二个视频
方法一:从2到x-1测试是否可以整除
int isPrime(int x)
{
int ret = 1;
int i;
if(x == 1) ret = 0;//处理 1不是素数 的问题
for(i=2; i<x; i++)
{
if(x%i == 0){
ret = 0;
break;
}
}
return ret;
}
对于n压迫循环n-1遍,当n很大时要循环n遍
方法二:去掉偶数后,从3到x-1,每次加2
int isPrime(int x)
{
int ret = 1;
int i;
if(x == 1 || (i%2==0 && i!=2)) ret = 0;//处理 1不是素数 的问题, 偶数不算素数
for(i=3; i<x; i+=2)
{
if(x%i == 0){
ret = 0;
break;
}
}
return ret;
}
如果x时偶数,立刻判断出来,否则要循环(n-3)/2 +1遍,当n很大时就是n/2遍
方法三:改进方法二,不需要走动x-1,只需要走到sqrt(x)就行了,需要在头文件加math.h
int isPrime(int x)
{
int ret = 1;
int i;
if(x == 1 || (i%2==0 && i!=2)) ret = 0;//处理 1不是素数 的问题, 偶数不算素数
for(i=3; i<sqrt(x); i+=2)
{
if(x%i == 0){
ret = 0;
break;
}
}
return ret;
}
只需要走sqrt(x)遍就可以了。
方法四:判断能否被已知的且小于x的素数整除,前提是需要先有一张已有的素数表
适用场景:构造素数表
#include <stdio.h>
int isPrime(int x, int KnownPrimes[], int numberOfKnownPrimes);
int main(int argc, const char * argv[]) {
// insert code here..
const int number = 100;
int prime[number] = {2};//初始素数表中只有2
int count = 1;//记录素数表内元素个数
int i=3;
//构造素数表
while (count < number) {
if( isPrime(i,prime,count)){
prime[count++] = i;
}
i++;
}
//打印素数表 5个一行
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)//传入要检测的数x,已知的素数表,已知素数表的个数
{
int ret = 1;
int i;
for( i=0; i<numberOfKnownPrimes; i++ )
{
if( x % KnownPrimes[i] == 0){
ret = 0;
break;
}
}
return ret;
}
构造素数表
欲构造n以内的素数表 算法描述
1、令x=2;
2、将2x、3x、4x以及ax标记为非素数;
3、令x为下一个没有被标为的非素数的数,重复2,知道所有的数都已尝试完毕;
欲构造n以内(不含)的素数表 伪代码描述
1、开辟prime[n],初始化所有元素为1,prime[x]为1表示x是素数;
2、令x=2;
3、如果x是素数,对于(i=2;x*i<n; i++)令prime[x*i] ==0;
4、令n++,如果x<n,重复步骤3,否则结束。
#include <stdio.h>
int main(int argc, const char * argv[]) {
// insert code here...
const int maxNumber = 25;
int isPrime[maxNumber];
int x;
int i;
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]){
printf("%d\t", i);
}
}
printf("\n");
return 0;
}