G - 美素数
2016-07-20 21:12
253 查看
G - 美素数
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64uSubmit
Status
Description
小明对数的研究比较热爱,一谈到数,脑子里就涌现出好多数的问题,今天,小明想考考你对素数的认识。
问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为“美素数”,如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
题意:确定所给整数区间的美素数个数(小心数据溢出),美素数为素数且所有位数之和为素数。
思路:打出题中所给范围的素数表,根据此表打出从个数表(从1到数组下标所代表的整数)。
失误:刚开始没想到打一个区间个数表,应尽量优化相同的部分尤其耗时大的的循环。
代码如下:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; int c[1111111]={1,1},a[1111111]={0}; int main() { __int64 i,j,l,t,flag,m,n,s,cnt,k,L,R; for(i=2;i<=1000010;++i) { if(c[i]==1) { continue; } for(j=2*i;j<=1000010;j+=i) { c[j]=1; } } for(i=2;i<=1000010;++i) { s=0; if(c[i]==0) { l=i; while(l!=0) { s+=l%10; l/=10; } if(c[s]==0) { a[i]=1; } } a[i]=a[i-1]+a[i]; } k=0; cin>>t; while(t--) { cin>>L>>R; cout<<"Case #"<<++k<<':'<<' '<<a[R]-a[L-1]<<endl; } return 0; }
相关文章推荐
- WSDL解析
- Codeforces Round #315 (Div. 2) B 水题强行set
- lambda表达式匿名函数
- UVA-113 Power of Cryptography
- 如何创建ID3DInclude的实例
- 学习排序算法
- C++中new和delete的用法注意。
- mysql数据库操作
- 深入理解View(二):Activity的页面结构
- 关于post请求超出最大长度
- hadoop 手机流统计
- Codeforces Round #305 (Div. 2) D 栈
- Android流式布局实现
- IOS学习笔记-CocoaPods类库管理工具安装
- 浅谈IP分片和组装的原理
- RPC-server的创建过程
- [Boost]boost的时间和日期处理日期的操作和时间的操作
- hdu5723 多校第一题,longlong
- Spring mcv 框架 浅谈
- GCC简明教程(1)