题解报告:hdu 1431 素数回文

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1431

解题思路:这道题交了10次才A掉(怪菜鸡太弱。。。),刚开始是直接用欧拉筛算法模板+简单的判断回文,结果显示超内存。。。欧拉筛的时间复杂度可是O(n)线性时间。。。这样我重新解读题目,其最大范围是10的8次方,但多次小修改提交后还是超内存。于是直接用了暴力,结果显示超时,无奈将这两个算法结合在一起,结果还是显示超时。当看到题解之后才明白,欧拉筛(埃氏筛也一样)里面用到int数组开辟的空间比较占内存,这就是超内存的原因,而单独用bool类型来判断的话就刚刚好,因为它占1个字节。超时就是算法不高级,这个不用说了吧。还有在这10的8次方内最大的回文素数是9989899(7位数),于是只需枚举到9999999(7位数),这样就节省了一大堆时间,也就基本不会超时了。A这道题的解法就是先单独写一个判断回文的函数;再判断素数时先筛掉偶数,再从奇数中进行筛掉一些合数,这样就不会用到int数组,也不会涉及到内存超过限制的原因了。好了,上代码吧!

AC代码:

 1 #include<bits/stdc++.h>
 2 #define maxn 9999999
 3 using namespace std;
 4 bool prime1[maxn];
 5 int cnt,a,b;//标记素数
 6 bool prime2(int n)//判断素数是否回文
 7 {
 8     int sum=0,tmp=n;
 9     while(tmp){
10         sum=sum*10+tmp%10;
11         tmp/=10;
12     }
13     if(sum==n)return true;
14     else return false;
15 }
16 int main()
17 {
18     memset(prime1,true,sizeof(prime1));
19     prime1[0]=prime1[1]=false;
20     for(int i=4;i<maxn;i+=2)prime1[i]=false;//先筛掉偶数
21     for(int i=3;i<=3163;i+=2){//再在剩下奇数中寻找,maxn的开方是3162多一点,这里取3163
22         if(prime1[i]){//当前的奇数是素数
23             for(int j=i*i;j<maxn;j+=2*i)prime1[j]=false;//枚举从平方开始后面的奇数
24         }
25     }
26     while(cin>>a>>b){
27         for(int i=a;i<=b;i++){
28             if(i>=maxn)continue;//超过范围的最大素数则继续循环
29             if(prime2(i)&&prime1[i])cout<<i<<endl;//先判断是否是回文数,再判断是不是素数,这样的话就不会超时
30         }
31         cout<<endl;
32     }
33     return 0;
34 }

原文地址:https://www.cnblogs.com/acgoto/p/8506714.html

时间: 2024-10-07 20:49:33

题解报告:hdu 1431 素数回文的相关文章

F题 hdu 1431 素数回文

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1431 素数回文 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 15041    Accepted Submission(s): 3359 Problem Description xiaoou33对既是素数又是回文的数特别感兴趣.比如说151

HDU 1431 素数回文(打表+技巧,最大回文素数为9989899!!!)

素数回文 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 17512    Accepted Submission(s): 4033 Problem Description xiaoou33对既是素数又是回文的数特别感兴趣.比如说151既是素数又是个回文.现在xiaoou333想要你帮助他找出某个范围内的素数回文数,请你写个程序找出 a

hdu 1431 素数回文(暴力打表,埃托色尼筛法)

这题开始想时,感觉给的范围5 <= a < b <= 100,000,000太大,开数组肯定爆内存,而且100000000也不敢循环,不超时你打我,反正我是不敢循环. 这题肯定得打表,筛素数肯定用埃托色尼筛法(不好意思把大名鼎鼎的埃拉托色尼名字打错了,表打我). 再看当你所找的回文数的位数为偶数时,有如下定理除11外所有偶数位数的回文数都能被11整除,所以所有偶数位数的回文都不是素数. 证明看如下(我手写的) 手机像素渣(凑活着吧)字丑也凑和着. 证完后我们在来说题目给的数据范围 所以当

HDU 1431 素数回文【暴力求解】

/* 题目大意:找一个范围内的所有素数回文数 解题思路:打一个表将1亿以内所有的素数回文数找出来,大概有780个这样子 关键点:暴力求解 解题人:lingnichong 解题时间:2014-08-29 12:02:55 解题体会:如果按一般方法打个素数表,很容易超内存(MLE),所以就先将所有的素数回文全部算出来,再在这个数组里面找在题上那个范围的所有素数回文数 */ 素数回文 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 655

HDU 1431 素数回文(回文素数)

http://acm.hdu.edu.cn/showproblem.php?pid=1431 题意: 给你两个整数a,b.(5 <= a < b <= 100,000,000)要你按顺序输出[a,b]区间内的所有回文素数. 分析: 定理:如果一个数是回文且有偶数位,那么它能被11整除. 根据上面定理我们可知我们只需要找到区间[2,1000W)内的素数即可.(想想为什么)上面b的范围直接缩小了10倍. 剩下的工作就是用筛选法求出1000W内的所有素数,然后对于给定的a和b,我们对于[a,b

HDU 1431 素数回文

有人问我这个问题. 个人感觉暴搜会TLE O(n*sqrt(n)).n=100000000:(判断素数用2~sqrt(n)+1 去除) 还是枚举好了.枚举 1~10000,把他每一位存下来,回文数已知 left ,求 right ,然后组合起来. 例如 1 ,判断 11 是否素数. 例如 10 ,判断 101 是否素数, 判断 1001 是否素数. 这样复杂度就是 O(n^2). 开始我 bool pa[100000000] 准备用标记来确定.结果MLE. 然后算了一下 总共有多少个数,最多 7

HDU 1431 素数回文-暴力枚举

题目链接:点击打开链接http://acm.hdu.edu.cn/showproblem.php?pid=1431 这道题搞了几天一直Memory Limit Exceeded,始终找不到错误,求指教,不胜感激! 后附有枚举代码! #include <stdio.h> #include <string.h> #include <string> #include <math.h> #include <stdlib.h> #include <i

05:素数回文数的个数

描述 求11到n之间(包括n),既是素数又是回文数的整数有多少个. 输入 一个大于11小于1000的整数n.输出11到n之间的素数回文数个数. 样例输入 23 样例输出 1 提示回文数指左右对称的数,如:292,333. 来源 06计算概论课 代码 1 略 2 using namespace std; 3 bool sunum(int a) 4 { 5 for(int i=2;i<=sqrt(a);i++) 6 { 7 if(a%i==0) return 0; 8 } 9 return 1; 1

素数回文

素数回文 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 15296    Accepted Submission(s): 3421很耗时间, Problem Description xiaoou33对既是素数又是回文的数特别感兴趣.比如说151既是素数又是个回文.现在xiaoou333想要你帮助他找出某个范围内的素数回文数,请你写个程序