sdut1468求素数

来源:互联网 发布:淘宝品牌库申请入口 编辑:程序博客网 时间:2024/06/04 19:52

意思就是给一个数字,让求小于这个数字的所有素数的个数。范围是比较大的,所以普通的办法就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 ExceededTake time: 110msTake Memory: 0KBSubmit 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: AcceptedTake time: 80msTake Memory: 1448KBSubmit 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: AcceptedTake time: 20msTake Memory: 2020KBSubmit time: ****************************************************/

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

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 陈柏融回应与张予曦分手 张曦予 张天予资料 张予曦全乳不遮挡 张予馨 张二嫂 张二嫂2018收入排行 二嫂帮你弄出来 二嫂 二嫂app 东北二嫂在线播放 东北二嫂35分钟在线播放 东北二嫂播放 二嫂不让戴套 大战二嫂和闺蜜 韩国片年轻二嫂中文 齐二嫂串门 张二狗 张二狗的传奇人生 烟囱里有鱼 张二狗的盗墓生涯 紫颜蓝王 张二狗的妖孽人生3全本 云里梦想乐园门票多少钱一张 张支云酱香型53度酒 张五常言论 张五常 房价 张五常书籍 张五常简介 张五常 邮箱 张小飞车祸 三亚的飞机票多少钱一张 去三亚飞机票多少钱一张 去三亚的飞机票多少钱一张 张井生 张井生通缉 张井生个人资料 张井生为什么被通缉 张井生到底是什么人物 张井生资料 江苏滨海传奇张井生 张亚中提案农民养老 张亚勤