社区讨论

学霸快来看看,答案都是对的,就是不过

P1217[USACO1.5] 回文质数 Prime Palindromes参与者 4已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mi6gifkf
此快照首次捕获于
2025/11/20 04:30
4 个月前
此快照最后确认于
2025/11/20 04:30
4 个月前
查看原帖
CPP
var
 i,j,a,b,c,d,gs:longint;
 s,s1:string;
 c1:char;
 ss:array[1..7000] of longint;
 t,y:text;
procedure qs(l,r:longint);  //快排
var
  i,j,t:longint;
  m:longint;
begin
  i:=l;j:=r;
  m:=ss[(i+j) div 2];
  repeat
    while ss[i]<m do inc(i);
    while ss[j]>m do dec(j);
    if i<=j then begin
      t:=ss[i];ss[i]:=ss[j];ss[j]:=t;
      inc(i);dec(j);
    end;
  until i>j;
  if l<j then qs(l,j);
  if i<r then qs(i,r);
end;
function pr(n:longint):boolean;  //判质数
var
 i:longint;
begin
 if n=0 then exit(false);
 i:=2;
 while i<=sqrt(n) do begin
  if n mod i=0 then exit(false);
  i:=i+1;
 end;
 exit(true);
end;
begin          //主程序
 assign(t,'pr.in');
 assign(y,'pr.out');
 reset(t);
 rewrite(y);      //建文件
 gs:=1;
 readln(t,a,b);   //读入
 if a<10 then     //10以内
  for i:=a to 7 do if pr(i) then begin
   ss[gs]:=i;
   gs:=gs+1;
  end;
 for i:=1 to trunc(sqrt(b))*10 do begin  //10以上 把数切成一半,再翻过去,再判质数
  str(i,s);                  //把数赋值给字符串
  s1:=s;                     //第2个字符串
  for j:=length(s) downto 1 do s:=s+s[j];  //把第一个字符串翻过去
  val(s,c);
  if (c<=b) and (c>=a) and pr(c) then begin
   ss[gs]:=c;
   gs:=gs+1;
  end;
  for c1:='0' to '9' do begin    //把第二个字符串加个数在翻过去
   str(i,s1);
   s1:=s1+c1;
   for j:=length(s1)-1 downto 1 do s1:=s1+s1[j];
   val(s1,c);
   if (c<=b) and (c>=a) and pr(c) then begin
    ss[gs]:=c;
    gs:=gs+1;
   end;
  end;
 end;
 qs(1,gs-1);      //排序
 for i:=1 to gs-1 do writeln(y,ss[i]);    //输出
 writeln(y,gs-1);
 close(t);
 close(y);
end.

回复

3 条回复,欢迎继续交流。

正在加载回复...