sdut1468求素数

意思就是给一个数字,让求小于这个数字的所有素数的个数。范围是比较大的,所以普通的办法就gg了
这是第一种gg的办法:

#include<iostream>
#include<algorithm>
#include<string>
#include<map>
using namespace std;
int isprime(int n) {
    int sum = 0;
    if (n >= 2)sum = 1;
    else return 0;
    for (int i = 3; i <= n; i++) {
        int flag = 1;
        for (int j = 2; j <= sqrt(i); j++) {
            if (i % j == 0) {
                flag = 0;
                break;
            }
        }
        flag ? sum += flag : sum = sum;
    }
    return sum;
}
int main(void) {
    int n; 
    while (cin >> n) {
        if (n == 0)break;
        cout << isprime(n) << endl;
    }
    //system("pause");
    return 0;
}

/***************************************************
User name: 
Result: Time Limit Exceeded
Take time: 110ms
Take Memory: 0KB
Submit time: 
****************************************************/

下面是ac过的用的是欧拉筛选的办法。但是时限还是比较高

#include<stdio.h>  
#include<string.h>
#include<iostream>
using namespace std;  
#define max 1000000  
int prime[max/3];  
bool flog[max];//只存在一真一假  

void getprime()  
{  
 int k=0;  
 for(int i=2;i<max;i++)  
 {  
  if(!flog[i])prime[k++]=i;//若没被标记成true,则为素数,进入数组。  
  for(int j=0;j<k&&i*prime[j]<max;j++)//&&后面的条件表示比max大的数不用判断,不再范围内。  
  {  
   flog[i*prime[j]]=true;//重点:每个素数的倍数肯定不是素数。  
   if(i%prime[j]==0)break;/*重点:当 i 能整除 prime[j],那么 i*prime[j+1] 这个合数 
                                             肯定被 prime[j] 乘以某个数(比i大)筛掉。 
                                            因为i中含有prime[j], prime[j] 比 prime[j+1] 小。 
                                           /接下去的素数同理。所以不用筛下去了*/  
  }  
 }  
}  
int main()  
{  

int n;  
while(~scanf("%d",&n),n!=0)  
{  
int c=0;  
memset(flog,false,sizeof(flog));//初始化为false  
 getprime();  
 for(int i=2;i<n;i++)  
 {  
  if(flog[i]==false)  
  {  
    c++;  
  }  
 }  
 printf("%d\n",c);  
}  
return 0;  

} 

/***************************************************
User name: 
Result: Accepted
Take time: 80ms
Take Memory: 1448KB
Submit time: 
****************************************************/

第三种也是我目前知道的比较快的,但是空间也消耗的比较多

#include <stdio.h>       
#include <math.h>       

#define SIZE 1000000       

int Prime[SIZE];      

void JudgePrime();        

int main()      
{      
    int n;      
    int i;      
    int sum;      

    JudgePrime();    

    while (scanf("%d", &n))      
    {      
        if (n == 0)      
        {      
            break;      
        }      

        if (n <= 2)      
        {      
            printf("0\n");      
            continue;      
        }      

        sum = 0;      
        for (i=2; i<n; i++)      
        {      
            if (Prime[i] == 1)      
            {      
                sum++;      
         }      
        }      
        printf("%d\n", sum);      
    }      
    return 0;      
}      

void JudgePrime()      
{      
    Prime[0] = 0;      
    Prime[1] = 0;      
    int i, j;      
    for (i=2; i<SIZE; i++)      
    {      
        Prime[i] = 1;      
    }      

    for (i=2; i<SIZE; i++)      
    {      
        if (Prime[i] == 1)      
        {      
            for (j=i*2; j<SIZE; j+=i)      
            {      
                Prime[j] = 0;      
            }      
        }      
    }      
} 

/***************************************************
User name: 
Result: Accepted
Take time: 20ms
Take Memory: 2020KB
Submit time: 
****************************************************/

在里面我还看见了某些大佬的时限是16ms的空间也就500左右,很好奇是什么算法这么好用,但是楼主并没找到源码,若是有知道的道友还望赐教

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值