最大素数子串

 

一个整数的整数子串是由该整数的连续若干位的数字构成。例如:6158的子串包括6,l,5,8,61,15,58,615,158,6158,其中质数子串有:5,61。你的任务是找出其中最大的质数子串,说明:0,1不是质数。
[输入格式]
键盘输人整数N(O≤N≤l OOO OOO OOOO)。
[输出格式]
屏幕输出N的最大质数子串,若所有子串都是非质数,则输出“No primes”。
[输入样例1]
319
[输出样例1]
31
[输入样例2]
6804
[输出样例2]
No primes

 

 

const

    maxn=9;

    p:array[0..9] of longint=(1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000);

var

    n,len,m,i,k,ans:longint;

    a:array[1..maxn+1] of longint;

 

function prime(a:longint):boolean;

var i,j:longint;

begin

    if (a=0)or(a=1) then begin prime:=false; exit; end;

    j:=trunc(sqrt(a));

    for i:=2 to j do

        if a mod i=0 then begin prime:=false; exit; end;

          ①  ;

end;

 

begin

    readln(n);

    len:=trunc(ln(n)/ln(10))+1;

    for i:=1 to len do

    begin

        a[i]:=n mod 10; n:=n div 10;

    end;

    for k:=len downto 1 do

    begin

        ans:=-1; m:=0;

        for i:=k downto 1 do m:=m*10+a[i];

        if   ②   then ans:=m;

        for i:=k+1 to len do

        begin

              ③  ;

            if prime(m)and(m>ans) then ans:=m;

        end;

        if   ④   then begin writeln(ans); break; end;

    end;

    if ans=-1 then writeln('No primes');

end.

 

【答案】

①prime:=true

②prime(m)and(m>ans)

③m:=m div 10+a[i]*p[k-1]

④ans<>-1

 

 

const
    maxn=9;
    p:array[0..9] of longint=(1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000);
var
    n,len,m,i,k,ans:longint;
    a:array[1..maxn+1] of longint;

function prime(a:longint):boolean;
var i,j:longint;
begin
    if (a=0)or(a=1) then begin prime:=false; exit; end;
    j:=trunc(sqrt(a));
    for i:=2 to j do
        if a mod i=0 then begin prime:=false; exit; end;
    prime:=true;
end;

begin
    readln(n);
    len:=trunc(ln(n)/ln(10))+1;
    for i:=1 to len do
    begin
        a[i]:=n mod 10; n:=n div 10;
    end;
    for k:=len downto 1 do
    begin
        ans:=-1; m:=0;
        for i:=k downto 1 do m:=m*10+a[i];
        if prime(m)and(m>ans) then ans:=m;
        for i:=k+1 to len do
        begin
            m:=m div 10+a[i]*p[k-1];
            if prime(m)and(m>ans) then ans:=m;
        end;
        if ans<>-1 then begin writeln(ans); break; end;
    end;
    if ans=-1 then writeln('No primes');
end.

 

posted @ 2014-09-20 18:13  qilinart  阅读(203)  评论(0编辑  收藏  举报