您的位置:首页 > 其它

选美素数~~~~~~~(⊙o⊙)

2015-08-18 11:31 239 查看
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

思路:
打表。质数的倍数一定是合数,利用这点我们就可以把合数都标记出来

#include<iostream>
#include<cstring>
using namespace std;
const int M = 1000010;
int isprime[M];
int isbuprime_sum[M];
void prime()
{
memset(isprime, 0, sizeof(isprime));
memset(isbuprime_sum, 0, sizeof(isbuprime_sum));
isprime[0] = 1;
isprime[1] = 1;                     //初始化
for (int i = 2; i < M; i++)
{
if (isprime[i])                        //判断,是合数就直接跳过
continue;
for (int j = i+i; j < M; j += i)       //先把素数的倍数(就是合数)都标记好
{
isprime[j] = 1;
}
}
}

int sumsum(int k)
{
int sum = 0;
while (k)
{
sum += k % 10;                       //各个位数的和,以便后面判断
k /= 10;
}
return sum;
}

int main()
{
prime();
isbuprime_sum[0] = isbuprime_sum[1] = 0;
for (int i = 2; i < M; i++)
{
if (!isprime[i] && !isprime[sumsum(i)])          //之前素数被标记为0了
isbuprime_sum[i] = isbuprime_sum[i - 1] + 1; //是美素数就计一次数
else
isbuprime_sum[i] = isbuprime_sum[i - 1];   //不是美素数,当前计数不变
}
int T,ans=1;
cin >> T;
while (T--)
{
int R, L;
cin >> L >> R;
cout << "Case #" << ans++ << ": " << isbuprime_sum[R] - isbuprime_sum[L - 1] << endl; //输出L-1因为包括左右端点

}

return 0;
}


心得:

再get一招,可以这样找素数,简直棒棒的,哈哈,集训太快了,转眼就快结束了。还真有点舍不得就回家了呢,说多了,学到知识更重要,加油加油啦~~~~~~~♪(^∇^*)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: