Est


私信TA

用户名:Est

访问量:21553

签 名:

等  级
排  名 647
经  验 4056
参赛次数 0
文章发表 16
年  龄 0
在职情况 学生
学  校 tjnu
专  业

  自我简介:

解题思路:


       定义一个数组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);
}


 

0.0分

79 人评分

  评论区

各位大神为啥我这个不对呀,求指教
#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;
}
2021-03-20 21:06:42
简简单单
#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;
}
2021-02-04 15:56:13
//输入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;
}
2020-11-07 15:07:33
#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;}
		}
	}
}
为什么我这个显示答案错误
2020-11-02 20:05:56
你这方法二有错误啊,输出不了2啊,答案错误,你没验证吗?这么草率的就发出来好吗
2020-04-07 09:32:18
大神我想问一下为什么我这个不行吗?求解答
#include<stdio.h>
ss(int i)
{
	int j;
	for(j=2;j<i;j++)
	{
	  if(i%j==0)
	    return 0;
	}
}
main()
{
   int i,n,j,k;
   scanf("%d",&n);
   if(n!=1&&n!=0)
   {
   for(i=2;i<=n;i++)
     {
     	if(ss(i))
     	  printf("%d\n",i);
	 }
   } 
 }
2020-03-09 09:54:40
请问一下为什么我这个方法不行呢
#include <stdio.h>
 
 int main()
{
 	int n,i;
 	scanf("%d",&n);
 	for(i=0;i<n;i++)
 	{
 		if(i==0 || i==1)
 		{
		 	continue;
	 	}
	 	if(i==2 || i==3 || i==5 || i==7)
	 	{
	 		printf("%d\n",i);
	 	}
	 	if(i%2!=0 && i%3!=0 && i%5!=0 && i%7!=0)
	 	{
 			printf("%d\n",i);
 		} 
	}
	return 0;
 }
2020-02-13 14:23:01
第一种方法其实有一点错误, 当n为3时,素数输出只有2。
2019-09-07 11:03:13