zoukankan      html  css  js  c++  java
  • goj 校庆素数

    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 }
  • 相关阅读:
    K
    A
    2017 Multi-University Training Contest
    第一章 概述
    校赛F 比比谁更快(线段树)
    POJ 3683 Priest John's Busiest Day
    POJ 2186 Popular Cows
    第十五周讨论
    线段树模板(单点更新,区间更新,RMQ)
    2-SAT问题(白书)
  • 原文地址:https://www.cnblogs.com/acgoto/p/9026271.html
Copyright © 2011-2022 走看看