ACM-ICPC 2018 沈阳赛区网络预赛 K Supreme Number 打表找规律

1.题意:定义super Number是这么一种数字:任意字串都是素数或者1(注意:这里字串不连续!),给出n,求出<=n的最大的super Number(n<= 10^100)

2.分析:这里直接打表找规律

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100000000;
int prime[maxn],tot;
bool judge[maxn];
void IsPrime(){

   for(int i = 2;i<=maxn;i++){
       if(!judge[i]){
          prime[tot++] = i;
       }
       for(int j = 0;j<tot;j++){
          if(i*prime[j]>maxn)break;
          judge[i*prime[j]] = 1;
          if(i%prime[j]==0)break;
       }
   }
}
int main()
{
    tot = 0;
    memset(judge,0,sizeof(judge));
    IsPrime();
    //cout<<tot<<endl;
    for(int i = 0;i<tot;i++){
        stringstream ss;
        ss<<prime[i];
        string name;
        ss>>name;
        bool flag = false;
        //cout<<"****"<<prime[i]<<endl;
        for(int len = 1;len<=name.size();len++){
            for(int i = 0;i<name.size()&&i + len<=name.size();i++){
                 int j = i + len - 1;
                 int sum = 0;
                 for(int k = i;k<=j;k++){
                    sum*=10;
                    sum=sum + (name[k] - '0');
                 }
                // cout<<sum<<endl;
                 if(judge[sum]){
                    flag = 1;
                    break;
                 }
            }
            if(flag)break;
        }
        if(!flag){
            printf("%d\n",prime[i]);
        }
    }
    return 0;
}

刚开始理解错了,以为只有连续的,所以这里打出来的表再排除一下。

1 2 3 5 7 11 13 17 23 31 37 53 71 73 113 131 137 173 311 313 317 373 1373 3137

1 2 3 5 7 11 13 17 23 31 37 53 71 73 113 131 137 173 311 317 

3.代码:

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int prime[30] = {1,2,3,5,7,11,13,17,23,31,37,53,71,73,113,131,137,173,311,317};
char num[150];
int main()
{
    int T;
    int t = 0;
    scanf("%d",&T);
    while(T--){
        t++;
        scanf("%s",num);
        if(strlen(num)>=4||(strlen(num)==3&&num[0]>='4')){
            printf("Case #%d: 317\n",t);
            continue;
        }
        int sum = 0;
        for(int i = 0;i<strlen(num);i++){
            sum*=10;
            sum+=(num[i] - '0');
        }
        int pos = upper_bound(prime,prime+20,sum) - prime;
        printf("Case #%d: %d\n",t,prime[pos-1]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40772692/article/details/82561180