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;
}