回 帖 发 新 帖 刷新版面

主题:再问回文质数

看了前面的一些帖子,程序本身可行但是运算时间太长了,有没时间短一点的?

回复列表 (共3个回复)

沙发

http://www.wzoi.org/usaco/11%5C204.asp
type arr=array[1..1000]of longint;
var
  i,j,k,l,n,m,a2,a3,max,sum:longint;
  out:array[1..1000]of longint;
procedure qsort(l,r:longint;var a:arr);
var x,i,j:longint;
begin
  if l>=r then exit;
  i:=l;j:=r;x:=a[i];
  repeat
    while (a[j]>=x)and(i<j) do dec(j);
    if (a[j]<x)and(i<j) then begin a[i]:=a[j]; inc(i); end;
    while (a[i]<=x)and(i<j) do inc(i);
    if (a[i]>x)and(i<j) then begin a[j]:=a[i]; dec(j); end;
  until i=j;
  a[i]:=x;
  qsort(l,i,a);qsort(i+1,r,a);
end;
function check(n:longint):boolean;
var
  i,j:longint;
begin
  check:=true;
  for i:=2 to round(sqrt(n)) do
    if n mod i=0 then begin check:=false; exit; end;
end;
procedure make2(s,t1,t2:longint);
var i,k:longint;
begin
  if t1=a2 div 10 then begin if check(s)and(s>=m)and(s<=n) then begin inc(sum);out[sum]:=s; exit; end; exit; end;
  k:=s;
  for i:=0 to 9 do
    begin
      s:=k+i*t1+i*t2;
      make2(s,t1 div 10,t2*10);
    end;
end;
procedure singler(n:integer);
var
  a1,a4,i,j:longint;
begin
  if n=1 then begin
    for i:=1 to 9 do
      if (i>=m)and(i<=max)and(i in[2,3,5,7]) then
      writeln(i);
              exit;
              end;
  a4:=1;for i:=1 to n div 2 do a4:=a4*10;
  a1:=1;for i:=1 to n-1 do a1:=a1*10;
  a2:=1;for i:=1 to n div 2+1 do a2:=a2*10;
  a3:=a2 div 100;
  for i:=1 to 9 do
    for j:=0 to 9 do
    if n<>3 then make2(a1*i+i+j*a4,a1 div 10,10)
            else make2(a1*i+i+j*a4,a2 div 10,250{no use});
end;
begin
  assign(input,'pprime.in');reset(input);
  assign(output,'pprime.out');rewrite(output);
  readln(m,n);sum:=0;
  k:=m;l:=n;i:=0;j:=0;
  while k<>0 do
    begin
      inc(i);
      k:=k div 10;
    end;
  while l<>0 do
    begin
      inc(j);
      l:=l div 10;
    end;
  max:=n;
  if j=9 then dec(j);
  for k:=i to j do
    if k mod 2=1 then singler(k);
  if (n>=11)and(m<=11) then begin inc(sum); out[sum]:=11; end;
  qsort(1,sum,out);
  for i:=1 to sum do writeln(out[i]);
  close(input);close(output);
end.



板凳

。。。貌似还是运行很久。。

3 楼

可以用枚举方法:
然后设计两个子程序
一个用来判断素数
一个用来判断回文数

我来回复

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