解题思路:


       定义一个数组prime[],赋初值为0数组下表对应这个数字,通过数组值来判断是否为素数

ex:

    prime[2]==0 表示2为素数  prime[8]==1 表示8不为素数

       

    根据算术基本定理:任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积

            所以若prime[i]==0,则prime[i*j]==1 即prime[i*j]不为素数

        只要i:2->n 即可构建n以内的质数表

注意事项:
        

        prime[0]=prime[1]=1;    //0 1特殊处理

参考代码:

#include<stdio.h>
int main(){
     int prime[10000]={0};
     int i,j;
     int n;
 
     scanf("%d",&n);
 
     prime[0]=prime[1]=1;
 
     for(i=2;i<n;i++)
         if(prime[i]==0)
               for(j=2;i*j<=n;j++)
                    prime[i*j]=1;
 
     for(i=0;i<n;i++)
          if(prime[i]==0)
               printf("%d\n",i);
 
     return 0;
}


下面是另一种求素数方法,如果可以优化的话在下方留言哦~

#include<stdio.h>
#include<math.h>
 
void judge(int n);
//----------------------------*
int main(void){
      int n,i;
      scanf("%d",&n);
      for(i=2;i<=n;i++)
          if(i%2!=0)        //去偶数
            judge(i);
      return 0;
}
//----------------------------*
void judge(int n){ 
     int i,flag=0;
     double sq;
     sq=sqrt(n);        //减少开根运算
     for( i=2;i<=sq;i++)     //因数都是成对存在的 而且因数对一定是一大一小(除平方根)
       if(n%i==0){
            flag=1;
            break;
           }
     if(flag==0)
         printf("%d\n",n);
}


点赞(32)
 

0.0分

44 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 36 条评论

xiaobai 5年前 回复TA
直接去掉偶数的方法好啊!
逻辑幻象 5年前 回复TA
#include<stdio.h>
int main(){
	int i=3,n;
	scanf("%d",&n);
	if(n>2){
		printf("2\n");
    	while(i<=n){
		    int k;
		    for(k=2;k<=i;k++){
			    if(i%k==0 && i!=k){
			    	break;
		    	}
			    else if(i%k==0 &&i==k){
			    	printf("%d\n",k);
			    }
		    }
		    i=i+2;
        }
    }
	return 0;	
}
将 i 的跨步改为2,能省一半的内存
我是熊大啊 6年前 回复TA
m=floor(sqrt(n)+0.5);
长歌 6年前 回复TA
最后的for循环应该小于等于n,不然当n为素数时,会把它漏掉
风一般的码农 6年前 回复TA
这会漏掉2这个素数。
风一般的码农 6年前 回复TA
通过改变条件可以优化程序运行速度