主题:USACO chapter 2 pprime解法
贺天行宝
[专家分:2300] 发布于 2006-02-07 09:34:00
如题
我做了,但超时了
希望那位高手帮我解答(最好有程序)谢谢!
回复列表 (共2个回复)
沙发
scyangbo [专家分:360] 发布于 2006-02-07 14:02:00
分位数直接生成回文数,然后用最朴素的方法判断素数就可以了。(我的程序可以参考一下)
{
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.
板凳
贺天行宝 [专家分:2300] 发布于 2006-02-07 17:52:00
恩不错的方法
谢谢
我来回复