找素数本来是很简单的问题,但当数据变大时,用朴素思想来找素数想必是会超时的,所以用素数筛法。

素数筛法 打表伪代码(用prime数组保存区间内的所有素数):

void isPrime()

vis[]数组清零;//vis[]数组用于标记是否已被检验过

prime[]数组全赋初值false;//prime[]数组从下标0开始记录素数

for i = 2 to MAXN (i++)

if 数i未被检验过

prime[tot++]=i;

for j = i*i to MAXN (j+=i) //j是i的倍数

标记该数已被否定,不是素数 //vis[j]=1;

最先做的是hdu的美素数,要求数n本身就是素数,而且n的各位数之和亦是素数,先打表,再进行素数筛法;函数cnt()中用到了dp思想

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<algorithm>
  6. using namespace std;
  7. const int MAXN=1000005;
  8. int ans[MAXN];
  9. bool prime[MAXN];
  10.  
  11. void isPrime()
  12. {
  13. memset(ans,0,sizeof(ans));
  14. memset(prime,true,sizeof(prime));
  15. prime[0]=prime[1]=false;
  16. for(int i=2;i<MAXN;i++)
  17. {
  18. if(!prime[i])
  19. continue;
  20. for(int j=i*2;j<MAXN;j+=i)
  21. prime[j]=false; //point!
  22. }
  23. }
  24.  
  25. int addWei(int n)
  26. {
  27. int sum=0;
  28. while(n)
  29. {
  30. sum+=n%10;
  31. n/=10;
  32. }
  33. return sum;
  34. }
  35.  
  36. void cnt()
  37. {
  38. ans[0]=ans[1]=0;
  39. for(int i=2;i<MAXN;i++)
  40. {
  41. if(prime[i]&&prime[addWei(i)])
  42. ans[i]=ans[i-1]+1;
  43. else ans[i]=ans[i-1];
  44. }
  45. }
  46.  
  47. int main()
  48. {
  49. int t,l,r;
  50. isPrime();
  51. cnt();
  52. scanf("%d",&t);
  53. for(int ca=1;ca<=t;ca++)
  54. {
  55. scanf("%d %d",&l,&r);
  56. printf("Case #%d: %d\n",ca,ans[r]-ans[l-1]);
  57. }
  58. return 0;
  59. }

第二道是poj上一道二次筛法的题目,如何进行二次素数筛,见下面代码:

参考此博:http://blog.csdn.net/a601025382s/article/details/12111297

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. typedef long long ll;
  6. //这个解法比较慢,但是好理解,其他快的暂时还理解不了
  7. const int N=47000;
  8.  
  9. ll l,u,prime[N];
  10. int tot;
  11. int vis[N],ans[10000005];
  12.  
  13. void isPrime()
  14. {
  15. tot=0;
  16. memset(vis,0,sizeof(vis));
  17. memset(prime,0,sizeof(prime));
  18. for(ll i=2;i<N;i++)
  19. {
  20. if(!vis[i])
  21. {
  22. prime[tot++]=i;
  23. for(ll j=i*i;j<N;j+=i)
  24. vis[j]=1;
  25. }
  26. }
  27. }
  28.  
  29. int main()
  30. {
  31. ll pre,maxn,u1,v1,minn,u2,v2;
  32. int flag;
  33.  
  34. isPrime();
  35. while(~scanf("%I64d%I64d",&l,&u))
  36. {
  37. if(l<=1)
  38. l=2;//1既不是素数,也不是合数
  39.  
  40. //二次筛选
  41. memset(ans,0,sizeof(ans));
  42. for(int i=0;i<tot&&prime[i]<=u;i++)
  43. {
  44. ll t=l/prime[i]+(l%prime[i]>0);
  45. if(t==1) t++;
  46. for(ll j=t*prime[i];j<=u;j+=prime[i])
  47. ans[j-l]=1;
  48. }
  49.  
  50. maxn=-2*N;minn=2*N;
  51. flag=0;
  52. for(ll i=l;i<=u;i++)
  53. {
  54. if(!ans[i-l])
  55. {
  56. flag++;
  57. if(flag>1)
  58. {
  59. int temp=i-pre;
  60. if(temp>maxn)
  61. {
  62. maxn=temp;
  63. u1=pre;v1=i;
  64. }
  65. if(temp<minn)
  66. {
  67. minn=temp;
  68. u2=pre;v2=i;
  69. }
  70. }
  71. pre=i;
  72. }
  73. }
  74. if(flag>1)
  75. printf("%I64d,%I64d are closest, %I64d,%I64d are most distant.\n",u2,v2,u1,v1);
  76. else printf("There are no adjacent primes.\n");
  77. }
  78. return 0;
  79. }

数学#素数筛法 HDU 4548&POJ 2689的更多相关文章

  1. 美素数(HDU 4548)(打表,简化时间复杂度)

    相信大家都喜欢美的东西,让我们一起来看看美素数吧. 问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为"美素数",如29,本身是素数,而且2+9 = 11 ...

  2. POJ 2689 筛法求素数

    DES:给出一个区间[L, U].找出这个区间内相邻的距离最近的两个素数和距离最远的两个素数.其中1<=L<U<=2147483647 区间长度不超过1000000. 思路:因为给出 ...

  3. HDU 4548 美素数(打表)

    HDU  4548  美素数(打表)解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=88159#problem/H 题目 ...

  4. poj 2689 Prime Distance(大区间素数)

    题目链接:poj 2689 Prime Distance 题意: 给你一个很大的区间(区间差不超过100w),让你找出这个区间的相邻最大和最小的两对素数 题解: 正向去找这个区间的素数会超时,我们考虑 ...

  5. 数学#素数判定Miller_Rabin+大数因数分解Pollard_rho算法 POJ 1811&2429

    素数判定Miller_Rabin算法详解: http://blog.csdn.net/maxichu/article/details/45458569 大数因数分解Pollard_rho算法详解: h ...

  6. 大区间素数筛选(POJ 2689)

    /* *POJ 2689 Prime Distance *给出一个区间[L,U],找出区间内容.相邻的距离最近的两个素数和距离最远的两个素数 *1<=L<U<=2147483647 ...

  7. hdu6069(简单数学+区间素数筛法)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6069 题意: 给出 l, r, k.求:(lambda d(i^k))mod998244353,其中 ...

  8. POJ 3292 Semi-prime H-numbers (素数筛法变形)

    题意:题目比较容易混淆,要搞清楚一点,这里面所有的定义都是在4×k+1(k>=0)这个封闭的集合而言的,不要跟我们常用的自然数集混淆. 题目要求我们计算 H-semi-primes, H-sem ...

  9. HDOJ 6069 素数筛法(数学)

    Counting Divisors Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Oth ...

随机推荐

  1. git 查看某个文件的历史修改版本

    [git status 查看修改的文件路径] git log --follow -p routes/admin/contract_operation.js

  2. Maven之(三)Maven插件

    Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,像编译是通过maven-compile-plugin实现的.测试是通过maven-surefire-p ...

  3. action中list传到JSP中取不到值的问题

    今天遇到了这个问题 action中list传到JSP中取不到值 搞了半天是因为我在JSP中取值的的时候 <s:iterator  value="shlist" var=&qu ...

  4. vue 2.0 无法编译ES6语法

    # vue2.0 webpack 无法编译 ES6 语法 之前在使用 vue 1.x 时用 vue-loader@8.0.0 版本可以正常打包vue的代码,包括ES6语法也能正常转为ES5语法,但是当 ...

  5. NASPhoto Station不只是储存的强大照片管理功能

    减少漫长的讨论时间,进而让你的艺术作品更符合客户需求.Photo Station 让你集中存储照片.随处分享及存取相簿并轻松收集朋友和客户反馈. 串流照片到大屏幕电视 DS photo 支援 Appl ...

  6. java-进程

    一个java进程,只有一个入口,就是main方法. tomcat是一个java进程,tomcat只有一个入口,org.apache.catalina.startup.Bootstrap  类的main ...

  7. git 基本的操作

      查看分支:git branch   查看所有分支:git branch -a   删除分支:git branch -d <name>   创建分支:git branch <nam ...

  8. HDU 5795 A Simple Nim(SG打表找规律)

    SG打表找规律 HDU 5795 题目连接 #include<iostream> #include<cstdio> #include<cmath> #include ...

  9. Regmon7.04绿色版(注册表变动实时监视工具)

    Regmon V7.04 简繁中文绿色版 软件大小: 155KB软件语言: 简体中文运行环境:Win9x/NT/2000/XP/2003/软件类别:国外软件 / 免费版 / 系统其它Regmon Re ...

  10. MinGW32 +QT4.8.6+QT Creator+CMAKE的安装

    参考网址: http://www.360doc.com/content/15/0813/09/7256015_491331699.shtml http://m.fx114.net/qa-196-213 ...