相信大家都喜欢美的东西,让我们一起来看看美素数吧。

问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为“美素数”,如29,本身是素数,而且2+9 = 11也是素数,所以它是美素数。

  给定一个区间,你能计算出这个区间内有多少个美素数吗?


Input 第一行输入一个正整数T,表示总共有T组数据(T <= 10000)。
接下来共T行,每行输入两个整数L,R(1<= L <= R <= 1000000),表示区间的左值和右值。 Output 对于每组数据,先输出Case数,然后输出区间内美素数的个数(包括端点值L,R)。
每组数据占一行,具体输出格式参见样例。 Sample Input

3
1 100
2 2
3 19

Sample Output

Case #1: 14
Case #2: 1
Case #3: 4

思路应该是很清晰的:十进制数是素数、它的各位数字和也是素数,这两个一判断就OK了。

但是因为数据很多还是会出现很多问题的,比如说超时,这时就需要我们打表了。

这里不要想着用筛法求素数,容易超时。

这是最开始的代码,一直超时

#include<cstdio>
#include<cstring>
using namespace std;
const int Max=1000005;
bool Mprime[Max];
int isprime(int a){int flag=1;for(int i=2;i*i<a;i++)if(a%i==0){flag=0;break;}return flag;
}
int add(int a){int flag=0,sum=0;while(a){sum+=a%10;a/=10;}if(isprime(sum)) flag=1;return flag;
}
int main()
{int t,l,r;memset(Mprime,0,sizeof(Mprime));for(int i=2;i<Max;i++){ //注意1不是素数,要从二开始 if(add(i)&&isprime(i)) Mprime[i]=1;}scanf("%d",&t);for(int j=1;j<=t;j++){int sum=0;scanf("%d%d",&l,&r);for(int i=l;i<=r;i++){  //这里每输入一组数据就要循环一次,如果每次输入数据间隔很大必然超时if(Mprime[i]) sum++;}printf("Case #%d: %d\n",j,sum);}
}

上代码:

#include<cstdio>
#include<cstring>
#include<cmath>
const int Max=1000005;
int sum[Max],p[Max]; //sum[i]存储比i小的素数的个数
int isprime(int a){for(int i=2;i<=sqrt(a);i++) //sqrt很重要,如果不用结果会不正确,因为如果用i*i可能会溢出if(a%i==0) return 0;return 1;
}
int add(int a){int sum=0;while(a){sum+=a%10;a/=10;}if(isprime(sum)) return 1;return 0;
}
int main()
{int t,l,r;    for(int i=2;i<Max;i++){ //注意1不是素数,要从二开始 if(add(i)&&isprime(i))p[i]=1;sum[i]=sum[i-1]+p[i]; //先填充数组p,在填充数组sum,即用两个循环也不会超时}scanf("%d",&t);for(int j=1;j<=t;j++){scanf("%d%d",&l,&r);printf("Case #%d: %d\n",j,sum[r]-sum[l-1]); //一定是l-1,不然就把l去掉了}
}

转载于:https://www.cnblogs.com/RenoStudio/p/10355228.html

美素数(HDU 4548)(打表,简化时间复杂度)相关推荐

  1. HDU 4548 美素数(打表)

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

  2. HDU 4548 美素数 素数题解

    本题就是能够直接打表的,推断能否够打表也须要技巧的: 1 推断最大的数值为1000000.百万下面的数打表都是能够的 2 能够线性预处理好.使用素数筛子法是能够接近线性预处理的. 故此能够打表了. 须 ...

  3. HDU 4548 美素数

    美素数 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submis ...

  4. 杭电 4548 美素数

    美素数 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submis ...

  5. HDU4548 美素数【水题】

    美素数 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submis ...

  6. ACM 美素数 (没AC)

    小明对数的研究比较热爱,一谈到数,脑子里就涌现出好多数的问题,今天,小明想考考你对素数的认识. 问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为"美素数" ...

  7. 【ACM】杭电OJ 4548 美素数(二次打表)

    二次打表,第一次是标记哪些是素数,哪些不是. 第二次是前n个数中   "本身是素数  &&  各个位上的和是素数  " 的个数 TLE: #include < ...

  8. 数学--数论--HDU - 6322 打表找规律

    In number theory, Euler's totient function φ(n) counts the positive integers up to a given integer n ...

  9. 【CodeForces - 271B 】Prime Matrix (素数,预处理打表,思维)

    题干: You've got an n × m matrix. The matrix consists of integers. In one move, you can apply a single ...

最新文章

  1. js实现轮播图,模拟flash上下滚动(原生JS,没有任何框架)
  2. 计算机桌面黑屏时间,电脑自动黑屏时间怎么调?
  3. Python 操作Word文档插入图片和表格实例演示
  4. java ctp行情_java-ctp
  5. Servlet使用基本步骤及功能实现
  6. 【模拟】表达式求值(jzoj 1768)
  7. 搜索框中“请输入搜索keyword”
  8. (转)Managed DirectX +C# 开发(入门篇)(一)
  9. 二十三种设计模式之工厂模式(含Java工厂模式的实现)
  10. 企业如何搭建商业智能BI,过程中又需要注意哪些事项
  11. 【库房】DateTime.Now.Date和DateTime.Now.TimeOfDay的用法
  12. 2019腾讯游戏客户端面试
  13. Xshell 免密连接云主机(以Vultr云服务为例)
  14. webservice java接口远程调用
  15. 2021年起重机司机(限门式起重机)考试及起重机司机(限门式起重机)找解析
  16. 国家医保的线上支付接口,需要签名算法SM2、加密算法SM4
  17. PYQT5水平布局后垂直方向控件间距的调整方法
  18. python定时器库_python定时器示例代码
  19. Codeforces积分系统介绍
  20. 立过的Flag——成为博客专家

热门文章

  1. 计算机屏幕显示电缆借口,电脑关机后显示器显示请检查电缆接口怎么办成功解决...
  2. java获取map大小_java – 从HashMap获取最大Set大小
  3. MacOS下保护浏览器主页和默认搜索
  4. Pixhawk---超声波模块添加说明(I2C方式)
  5. 瀑布式开发、迭代式开发、螺旋开发、敏捷开发四种开发模式的区别
  6. 磁盘文件读写和数据库读写哪个效率更高
  7. 深入理解 Linux的 I/O 系统
  8. android 百度定位开启后fragment 不显示,解决Android百度地图MapView在ViewPager中Fragment切换黑屏问题...
  9. c++内存管理-分配失败
  10. 使用内置的Gallery应用程序选择图形