算法一
最简单的利用质数的定义来求素数,利用循环从一到n依次判断。
代码如下:
#include<stdio.h>
#define N 100
int main(){
int i,j,k=0;
for(i=2;i<N;i++){
for(j=2;j<i;j++){
if(i%j==0){
break;
}
}
if(j==i){
k++;
printf("%d\t",i);
}
if(k%10==0){
printf("\n");
}
算法二
利用费马素数,简化上一个算法,不用从1到n循环判断,只需判断1到sqrt(n)就可以了,节约了时间和空间
代码如下:
#include<stdio.h>
#include<math.h>
#define N 100
int main(){
int i,j,k=0;
for(i=2;i<N;i++){
for(j=2;j<=sqrt(i);j++){
if(i%j==0){
break; //异常退出
}
}
if( j>sqrt(i) ){ //判断是否正常退出
printf("%d\t",i);
k++;
}
if(k%10==0){ //五个一行
printf("\n");
}
}
return 0;
}
算法三
利用筛法,依次循环去掉素数的倍数,留下的都是素数。从2开始,因为2是素数,我的算法中,使用逻辑判断来标记数组的下标,最后输出数组下标为非零的数组元素的下标。
筛法极大地提高了效率,但占用内存比较大,相当于以空间换时间。
代码如下;
//筛法求素数
#include<stdio.h>
#define N 100
int main(){
int k=0;
char isPrime[N+1]={0};
for(int i=2;i<N;i++){
isPrime[i]=1;
for(int i=2;i<N;i++){
if(isPrime[i])
for(int j=2*i;j<N;j=j+i){
isPrime[j]=0;
}
}
}
for(int i=0;i<N;i++){
if(isPrime[i]){
k++;
printf("%d\t",i);
}
if(k%10==0){
printf("\n");
}
}
return 0;
}
这只是基本的几种求素数算法,在这几种算法的基础上进一步优化,比如利用质数都是奇数的特性筛掉偶数,效率还会进一步提高。