ACM_校庆素数
Posted 霜雪千年
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }
以上是关于ACM_校庆素数的主要内容,如果未能解决你的问题,请参考以下文章