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

问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为“美素数”,如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去掉了
     }
}

美素数(HDU 4548)(打表,简化时间复杂度)的更多相关文章

  1. HDU 4548 美素数(打表)

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

  2. HDU 4548 美素数 在线打表加数状数组

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4548 解题报告:一开始本想先打个素数表,然后每次输入L 跟R 的时候都进行暴力判断,但这题测试数据太多 ...

  3. hdu 4548 筛法求素数 打表

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4548 Problem Description 小明对数的研究比较热爱,一谈到数,脑子里就涌现出好多数的问题 ...

  4. 杭电(hdu)ACM 4548 美素数

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

  5. HDU 4548(美素数)

    Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   Description 小明对数的 ...

  6. HDU 4548 美素数 素数题解

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

  7. HDU 4548:美素数

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

  8. hdu 4548 美素数 超级大水题

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

  9. hdoj 4548 美素数 【打表】

    另类打表:将从1到n的满足美素数条件的数目赋值给prime[n],这样最后仅仅须要用prime[L]减去prime[R-1]就可以: 美素数 Time Limit: 3000/1000 MS (Jav ...

随机推荐

  1. sklearn中实现随机梯度下降法(多元线性回归)

    sklearn中实现随机梯度下降法 随机梯度下降法是一种根据模拟退火的原理对损失函数进行最小化的一种计算方式,在sklearn中主要用于多元线性回归算法中,是一种比较高效的最优化方法,其中的梯度下降系 ...

  2. Jenkins + git + maven 安装

    1.jenkins安装 sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo ...

  3. MyEclipse8.5 + jdk 1.6.0_43 + tomcat6 + maven 3.0.4 + win7 32位 ,环境搭建并看到“hello world”

    一.前期准备 1.首先安装jdk,具体略,用java -version在cmd中看到下图所示就说明安装好了 2.安装tomcat6,具体略,在浏览器中输入http://localhost:8080/, ...

  4. 设备树DTS 学习:Linux DTS文件加载过程

    背景 了解机制有利于对内核有更深的认识. wget https://mirrors.aliyun.com/linux-kernel/v3.x/linux-3.2.61.tar.xz 内核 在drive ...

  5. 使用six库将Python2的项目完全转移到python3

    SIX是用于python2与python3兼容的库. 它存在的目的是为了拥有无需修改即可在Python 2和Python 3上同时工作的代码.话虽这么说,但是这并不代表在Python 3中引用该库就可 ...

  6. OS、浏览器排名:Win10狂飙、Chrome逆天

    根据 Netmarketshare公布的最新数据,2019年7月,Windows 10系统市场份额获得显著增长,市场份额创下新高:Windows 7则进一步衰退,份额下滑高达3.6%,这也是其历史上最 ...

  7. HihoCoder第一周与POJ3974:最长回文字串

    这个题目是hihoCoder第一周的题目,自己打算从第一周开始做起,不知道能追上多少,更不知道这一篇写完,下一篇会是什么时候... 题意很简单. 输入: abababa aaaabaa acacdas ...

  8. MySQL 错误代码

    常见: 1005:创建表失败 1006:创建数据库失败 1007:数据库已存在,创建数据库失败 1008:数据库不存在,删除数据库失败 1009:不能删除数据库文件导致删除数据库失败 1010:不能删 ...

  9. sql数据库系统表和mysql系统表

    sql数据库系统表,常用的(sysobjects,sysindexes,sysindexkeys,SYSCOLUMNS,SYSTYPES 及更多解释说明): https://docs.microsof ...

  10. 2013蓝桥杯预赛C/C++本科B组

    题目标题: 高斯日记 大数学家高斯有个好习惯:无论如何都要记日记. 他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210 后来人们知道,那个整数就是日期,它表示那一天是高斯 ...