容易想到不存在超过三位的数满足条件,打表找出所有三位及以下的数。
#include <iostream> #include <cmath> #include <cstring> using namespace std; bool IP(int x) { //bool flag=1; for(int i=2;i<=sqrt(x);i++) { if(x%i==0) {return 0;} } return 1; } inline bool check(int x) { int d[10]; int a[10]; if(0<x&&x<10) { if(x!=2&&x!=3&&x!=5&&x!=7&&x!=1) return 0; else return 1; } if(10<=x&&x<100) { if((x%10)!=2&&(x%10)!=3&&(x%10)!=5&&(x%10)!=7&&(x%10)!=1) return 0; if(((x/10))!=2&&((x/10))!=3&&((x/10))!=5&&((x/10))!=7&&((x/10))!=1) return 0; if(!IP(x)) return 0; return 1; } if(100<=x&&x<1000) { d[1]=x%10; d[2]=(x/10)%10; d[3]=(x/100)%10; //cout<<"asdf"<<endl; if((d[3])!=2&&(d[3])!=3&&(d[3])!=5&&(d[3])!=7&&(d[3])!=1) return 0; //cout<<"asdf"<<endl; if((d[2])!=2&&(d[2])!=3&&(d[2])!=5&&(d[2])!=7&&(d[2])!=1) return 0; // cout<<"asdf"<<endl; if((d[1])!=2&&(d[1])!=3&&(d[1])!=5&&(d[1])!=7&&(d[1])!=1) return 0; //cout<<"asdf"<<endl; a[1]=d[3]*10+d[2]; a[2]=d[3]*10+d[1]; a[3]=d[2]*10+d[1]; //cout<<a[1]<<a[2]<<a[3]<<endl; if(IP(a[1])==0||IP(a[3])==0||IP(a[2])==0||IP(x)==0) return 0; return 1; } } int main() { //check(731); //system("pause"); int a[100]; char s[1000]; int t,_,ans; int cnt=0; int CA=0; for(int i=1;i<=999;i++) { if(check(i)) { //cout<<i<<endl; a[++cnt]=i; } } int T,l,i; scanf("%d%*c",&T); while(T--) { scanf("%s%*c",s); //CA++; printf("Case #%d: ",++CA); l=strlen(s); if(l>3) { printf("317\n"); continue; } else { t=0; _=1; for(i=l-1;i>=0;i--) { t+=(s[i]-'0')*_; _*=10; } //cout<<t<<endl; ans=1; i=1; if(t>=317) { printf("317\n"); continue; } while(i<=cnt&&a[i]<=t) { ans=a[i]; i++; } printf("%d\n",ans); } } return 0; }