zoukankan      html  css  js  c++  java
  • 2018 ICPC 沈阳网络赛预赛 Supreme Number(找规律)

    【传送门】https://nanti.jisuanke.com/t/31452

    【题目大意】:给定一个数字(最大可达10100),现在要求不超过它的最大超级质数。超级质数定义:对于一个数,把它看成数字序列 ,如果它的所有子序列形成的数都是质数,那么它就是超级质数。

    比如说3137,它的子序列有3,1,7,31,33,37,313,317,137.....由于有一个子序列是33它不是质数,所有3137不是超级质数。

    【题解】注意,子序列和子串是不同的,子序列包含子串。子序列只要求相对顺序不变,而子串不仅仅要求顺序不变而且要求连续。比赛的时候因为这个WA了好几次。

    (1)首先我们很容易知道,某个数它是超级质数,那么它所有位必须都是质数,也就是说,每一位上的数字只可能是1,2,3,5,7

    (2)除了最高位可以是1,2,3,5,7,其余低位只能是1,3,7。因为2,5作低位必然有子序列不是质数。

    (3)除了1后面还可以接1之外,其余数字后面都不能再接这个数字。比如3后面不能再接3,否则33不是质数。

    (4)找出位数K = 1,2,3的所有满足条件的数,发现K = 4时,找不到4位数的超级质数。由于子序列不能是超级质数,那么4位以上的数不可能是超级质数。

    【AC代码】

    #include <queue>
    #include <cstdio>
    #include <string.h>
    #include <cstdlib>
    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    int a1[5] ={1,2,3,5,7};
    int a2[9] = {11,13,17,23,31,37,53,71,73};
    int a3[6] = {113,131,137,173,311,317};
    
    int main(){
        ios::sync_with_stdio(false);
        int t;
        cin>>t;
        string s;
        int k=1;
        while(t--)
        {
            cin>>s;
            cout<<"Case #"<<k++<<": ";
            int len = s.size();
            if(len == 1){
                int num = atoi(s.c_str());
                for(int i=4; i>=0; i--){
                    if(a1[i] <= num){
                        cout<<a1[i]<<endl;
                        break;
                    }
                }
            }
            else if(len == 2){
                int num = atoi(s.c_str());
                
                int flag = 0;
                for(int i=8; i>=0; i--){
                    
                    if(a2[i] <= num){
                        flag = 1;
                        cout<<a2[i]<<endl;
                        break;
                    }
                }
                if(flag == 0){
                    cout<<7<<endl;
                }
            }
            else if(len == 3){
                int num = atoi(s.c_str());
                int flag = 0;
                for(int i=5; i>=0; i--){
                    if(a3[i] <= num){
                        flag = 1;
                        cout<<a3[i]<<endl;
                        break;
                    }
                }
                if(flag == 0){
                    cout<<73<<endl;
                }
            }
            else if(len >= 4){
                cout<<"317"<<endl; 
            }
    
        }
        return 0;
    }
  • 相关阅读:
    Laravel kalnoy/nestedset
    Eloquent Subquery Enhancements in Laravel 6.0
    Laravel 6.0 中更加强劲的子查询
    Es6系列之module and class
    Using Laravel's Bootable Eloquent Traits
    Google Chrome Shortcut Keys
    另辟蹊径:vue单页面,多路由,前进刷新,后退不刷新
    docker-machine 创建主机的缺省密码 (Default User and Password)
    eslint Cannot read property 'range' of null错误( Quasar Doc )$ quasar dev 出错
    java比较排序Comparable和Comparator
  • 原文地址:https://www.cnblogs.com/czsharecode/p/9612674.html
Copyright © 2011-2022 走看看