1. 程式人生 > >【TOJ 4705】最大素數

【TOJ 4705】最大素數

sam ros i++ tro cstring 個數 ostream prime AC

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

【TOJ 4705】最大素數