校庆素数
Time Limit: 2000/1000ms (Java/Others)
Problem Description:
广财建校33年了,如今迎来了她的校庆。
小财最近想在研究素数,她突发奇想,把包含33的素数称为校庆素数。
她想知道在L和R之间(包含L和R)有多少个校庆素数,她觉得这个问题太简单了,于是想考一下你。
比如 2333 就是一个校庆素数。
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 }