Description
给定一个数n,问是否可以按从左到右的顺序从其中取出连续的若干位组合成一个素数(大于1,且只能被1和自身整除的数称为素数),若有多种可能,则取所有可能的数中最大的一个。
如在1234中,我们可以取1234,123,234,12,23,34,1,2,3,4,发现素数有2,3,23,其中最大的素数为23。
Input
输入数据有多组,每组占一行,每行一个正整数n(2<=n<=2147483647)。
Output
对于每组输出,若存在,则输出最大的素数,否则输出None
Sample input
1234
Sample output
23
注意:同位数时要注意取最大值的素数!!
#include<iostream> #include<cstring> #include<cmath> #include<algorithm> #include<sstream> using namespace std; int prime(int a) { int i; if(a==1||a==0) return 1; for(i=2;i<=sqrt(a);i++) { if(a%i==0) return 1; } return 0; } int ok(int m) { int i,s=1; for(i=1;i<=m;i++) s=s*10; return s; } int weishu(int a) { int s=0; while(a!=0) { a=a/10; s++; } return s; } int main() { int i,j,t,n,ws,k,p,a,maxx; while(scanf("%d",&n)!=EOF) { t=ws=weishu(n); //cout<<"ws="<<ws<<endl; k=n; maxx=-1; for(i=1;i<=ws;i++) { if(t==10) { if(prime(k)==0) { maxx=k; cout<<k<<endl; break; } t--; } else { p=ok(t); t--; //cout<<"i="<<i<<" p="<<p<<endl; k=n; for(j=1;j<=i;j++) { //cout<<"k="<<k<<endl; if(prime(k%p)==0) { a=k%p; maxx=max(a,maxx); } k=k/10; } if(maxx!=-1) { cout<<maxx<<endl; break; } } if(maxx!=-1)break; } if(maxx==-1)cout<<"None"<<endl; } return 0; }