回 帖 发 新 帖 刷新版面

主题:USACO chapter 2 pprime解法

如题
我做了,但超时了
希望那位高手帮我解答(最好有程序)谢谢!

回复列表 (共2个回复)

沙发

分位数直接生成回文数,然后用最朴素的方法判断素数就可以了。(我的程序可以参考一下)

{
ID:dabta881
PROG:pprime
LANG:PASCAL
}
program pprime(input,output);
var a,b,l,k:longint;
     input,output:text;
function prime(n:longint):boolean;
  var i:longint;
   begin
    prime:=true;
     for i:=2 to trunc(sqrt(n)) do
      if n mod i=0 then
       begin
        prime:=false;break;
       end;
   end;
procedure makeone(s:string;step:integer);
  var j,i,t:longint;code:integer;
   begin
    if step>(l+1)div 2 then
     begin
      for j:=(l+1)div 2+1 to l do
       s:=s+s[l-j+1];
      val(s,t,code);
      if (t>=a)and(t<=b) then
       if prime(t) then writeln(output,t);
      exit;
     end;
    for i:=0 to 9 do
     begin
      s:=s+chr(ord('0')+i);
      makeone(s,step+1);
      delete(s,length(s),1);
     end;
   end;
procedure maketwo(s:string;step:integer);
  var j,i,t:longint;code:integer;
   begin
    if step>l div 2 then
     begin
      for j:=l div 2+1 to l do
       s:=s+s[l-j+1];
      val(s,t,code);
      if (t>=a)and(t<=b)then
       if prime(t) then writeln(output,t);
      exit;
     end;
    for i:=0 to 9 do
     begin
      s:=s+chr(ord('0')+i);
      maketwo(s,step+1);
      delete(s,length(s),1);
     end;
   end;
begin
  assign(input,'pprime.in');reset(input);
  assign(output,'pprime.out');rewrite(output);
  read(input,a,b);
  for l:=trunc(ln(a)/ln(10))+1 to trunc(ln(b)/ln(10))+1 do
   if odd(l) then for k:=1 to 9 do begin
    if odd(k) then makeone(chr(ord('0')+k),2);end
   else for k:=1 to 9 do if odd(k) then
    maketwo(chr(ord('0')+k),2);
  close(input);close(output);
end.

板凳

恩不错的方法
谢谢

我来回复

您尚未登录,请登录后再回复。点此登录或注册