ACM_校庆素数

校庆素数

Time Limit: 2000/1000ms (Java/Others)

Problem Description:

广财建校33年了,如今迎来了她的校庆。
小财最近想在研究素数,她突发奇想,把包含33的素数称为校庆素数。
她想知道在L和R之间(包含L和R)有多少个校庆素数,她觉得这个问题太简单了,于是想考一下你。
比如 2333 就是一个校庆素数。

Input:

输入的第一行包括一个T(T <= 50),代表有T组数据。
每组数据输入两个整数L和R (1<= L <= R <= 500000)。

Output:

对于每组数据,输出"Case #x: y"(不包括引号),其中x代表数据的编号,从1开始,y代表该组数据的结果。

Sample Input:

2
1 233
1 232

Sample Output:

Case #1: 1
Case #2: 0

Hints:
1到233中只有233是校庆素数。
解题思路:求区间(L,R)中的整数包含“33”且是素数的个数。首先判断区间中是否有含“33”的整数,再判断这个数是否为素数即可。简单分析一下这个算法最坏的时间复杂度,假设区间长是5*10^5,判断区间的一个数是否含“33”,最多循环4次,(我们可以评估一下所含“33”的个数其实并不多,因此这个时间可以忽略)判断该数是否为素数时间为O(sqrt(n)),最多为(其实远小于,因为所含“33”的整数不多)10^3,所以综合起来应该是大于10^6但不会很大,提交一发,541msA过。
AC代码:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 bool isprime(int x){ //判断素数
 4     for(int i=2;i*i<=x;++i)
 5         if(x%i==0)return false;
 6     return true;
 7 }
 8 int main()
 9 {
10     int t,l,r,tmp,num;
11     cin>>t;
12     for(int j=1;j<=t;++j){
13         cin>>l>>r;num=0;//num是计数器
14         for(int i=l;i<=r;++i){
15             tmp=i;
16             while(tmp%100!=33 && tmp>10)tmp/=10;//先判断是否含"33"的整数,这里的tmp判断是否大于10,因为至少得有两位数才可以判断
17             if(tmp%100==33 && isprime(i))num++;//再判断是否为素数
18         }
19         cout<<"Case #"<<j<<": "<<num<<endl;
20     }
21     return 0;
22 }

猜你喜欢

转载自www.cnblogs.com/acgoto/p/9026271.html