【TOJ 4705】最大素数

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

相关推荐