天天看點

USACO 1.2 雙重回文數

Description

  如果一個數從左往右讀和從右往左讀都是一樣,那麼這個數就叫做“回文數”。例如,12321就是一個回文數,而77778就不是。當然,回文數的首和尾都應是非零的,是以0220就不是回文數。 

事實上,有一些數(如21),在十進制時不是回文數,但在其它進制(如二進制時為10101)時就是回文數。 

編一個程式,從檔案讀入兩個十進制數 

• N (1 <= N <= 15) 

• S (0 < S < 10000) 

然後找出前N個滿足大于S且在兩種以上進制(二進制至十進制)上是回文數的十進制數,輸出到檔案上。 

本問題的解決方案不需要使用大于4位元組的整型變量。 

Input

隻有一行,用空格隔開的兩個數N和S。

Output

N行, 每行一個滿足上述要求的數,并按從小到大的順序輸出。

Sample Input Sample Output
const
      
  f:array[0..9]of char=('0','1','2','3','4','5','6','7','8','9');
      
var
      
  i,j,k,m,n,s:longint;
      
  s1:string;
      
function check(i:longint):boolean;
      
  var
      
    j,k,l,kk,base:longint;
      
    dd:boolean;
      
  begin
      
     kk:=0;
      
     for base:=2 to 10 do
      
       begin
      
         s1:='';
      
         dd:=true;
      
         j:=i;
      
         while j<>0 do
      
           begin
      
             k:=j mod base;
      
             j:=j div base;
      
             s1:=s1+f[k];
      
           end;
      
         k:=length(s1);
      
         for l:=1 to k div 2 do
      
           if s1[l]<>s1[k-l+1] then dd:=false;
      
           if dd then inc(kk);
      
           if kk>=2 then  exit(true);
      
       end;
      
     exit(false);
      
end;
      
begin
      
  readln(n,m);
      
  s:=0;
      
  while s
      
    begin
      
      inc(m);
      
      if check(m) then begin inc(s);writeln(m);end;
      
    end;
      
end.