解题思路:


       定义一个数组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 条评论

3年前 回复TA
@邓明昊 你的if(flag==0)这个模块放错位置了,还有啥情况下flag等于0也没写出来
3年前 回复TA
@邓明昊 #include<iostream> using namespace std; int main(){ 	int n,flag=0; 	cin>>n; 	for(int j=2;j<n;j++){ 	 		for(int i=2;i<j;i++){ 			if(j%i==0){             flag=1;             break;            }else{flag=0; 		   }   	} 	if(flag==0)      cout<<j<<endl; } 	return 0; }修改你的代码后的样子自己看吧
邓明昊 3年前 回复TA
各位大神为啥我这个不对呀,求指教
#include<iostream>
using namespace std;
int main(){
	int n,flag=0;
	cin>>n;
	for(int j=2;j<n;j++){
	
		for(int i=2;i<j;i++){
			if(j%i==0){
            flag=1;
            break;
           }
     if(flag==0)
     cout<<j<<endl;
	}
}
	return 0;
}
月儿会弯 3年前 回复TA
简简单单
#include <stdio.h>
#include <math.h>

int main(int argc,int const*argv[])
{
	int i,j,k,number;
	scanf("%d",&number);

	for(i=1;i<=number;i++)
	{
		k=(int)sqrt( (double)i );
		for(j=2;j<=k;j++)
		{ 
			if(i%j==0)
			break;
		}
		if(j>=k+1&& i!=1 )
		printf("%d\n",i);
	}
	
	return 0;
}
啦啦啦 3年前 回复TA
@e^πi+1=0 #include <stdio.h> #include <math.h>   int main() {     int q, q1, i;     scanf("%d", &q1);     for(int q = 2; q <= q1; q++){     for(i = 2; i < sqrt(q); i++)     {         if(q % i == 0)break;     }     if(i > sqrt(q) || q == 2 || q == 3)printf("%d
",q);     }      return 0; }这样就可以
叶相依 4年前 回复TA
@人生亦梦 i<=sqrt(num)这个判断才是这道题的精妙
人生亦梦 4年前 回复TA
//输入m,找出0——m间的质数
//方法一,遍历查找
//这个较你的第二种算法可能更优化
#include<stdio.h>
#include<math.h>
int main ()
{
	int m;
	int num,e;
	e=0;
	scanf("%d",&m);

	for(int j=2;j<=m;j++)
		{
			num=j;
			for(int i=1;i<=sqrt(num);i++)
			{
				if(num%i==0)
				e++;
			}
			if(e==1)
			printf("%d\n",num);
			e=0;
		}	
		
	return 0;
}
e^πi+1=0 4年前 回复TA
#include<stdio.h>
void main()
{
	int i,j,a;
	scanf("%d",&a);
	for(i=2;i<=a;i++)
	{
		for(j=2;;j++)
		{
			if(i%j==0){break;}
			if(j==i-1){printf("%d\n",i);break;}
		}
	}
}
为什么我这个显示答案错误
张程序员 4年前 回复TA
@Geraint 你找到错误原因了吗 我也是这样写的
爱晴海玩偶 4年前 回复TA
@抹茶抄 函数都写错了,函数名前面的int呢?你的ss函数里面如果for循环都结束了没有返回0的话是返回啥