USACO-Chapter1-Section 1.2-Palindromic Squares (palsquare)

 

【题目描述】

      回文数是指从左向右念和从右向左念都一样的数。如12321就是一个典型的回文数。给定一个进制B(2<=B<=20,由十进制表示),输出所有的大于等于1小于等于300(十进制下)且它的平方用B进制表示时是回文数的数。用’A’,’B’……表示10,11等等。

【输入格式】

      共一行,一个单独的整数B(B用十进制表示)。

【输出格式】

      每行两个B进制的符合要求的数字,第二个数是第一个数的平方,且第二个数是回文数。

【输入样例】

10

【输出样例】

1 1
2 4
3 9
11 121
22 484
26 676
101 10201
111 12321
121 14641
202 40804
212 44944
264 69696

【思路】

      枚举1-300,转化为B进制下的数字。按照题目要求处理即可。

关于进制转换的方法:正数的进制转换因为比较简单,就不在赘述,下面谈谈负数的进制转换

转换带负数进制

// Change Minus Problem

Const

    c:array[0..19]of char=('0','1','2','3','4','5','6','7',

                                     '8','9','A','B','C','D','E','F',

                                     'G','H','I','J');

Var

  n,r,x,y,z:longint;

  ans:array[1..2000]of longint;

Begin;

  readln(n,r);

repeat;

  inc(x);

  ans[x]:=n mod r;

  n:=n div r;

  if ans[x]<0 then //如果小于零则减去该进制(相当于借位)

  Begin

    ans[x]:=ans[x]-r;

    n:=n+1;

  End;

until n=0;

for x:=x downto 1 do

  write(c[ans[x]]);

writeln;

End.

【代码】

  • Executing...
  • Test 1: TEST OK [0.000 secs, 276 KB]
  • Test 2: TEST OK [0.000 secs, 276 KB]  
  • Test 3: TEST OK [0.000 secs, 276 KB]
  • Test 4: TEST OK [0.000 secs, 276 KB]
  • Test 5: TEST OK [0.000 secs, 276 KB]
  • Test 6: TEST OK [0.000 secs, 276 KB]
  • Test 7: TEST OK [0.000 secs, 276 KB]
  • Test 8: TEST OK [0.000 secs, 276 KB]
  • All tests OK.

代码比较捉,神牛无视。

{
 ID  : c_CaM.19
 LANG: PASCAL
 TASK: palsquare
}
Program CaM(input,output);
Var
  a,c:array[0..500] of char;
  i,j,k,num,l,b,p:longint;

Procedure innt;
Begin
  assign(input,'palsquare.in'); reset(input);
  assign(output,'palsquare.out'); rewrite(output);
End;

Procedure outt;
Begin
  close(input);
  close(output);
End;

Procedure change(k:longint);
Var
  i,t:longint;
  ch:char;
Begin
  fillchar(a,sizeof(a),0); j:=0;
  while k>0 do
  Begin
    inc(j);
    t:=k mod b;
    case t of
      10:ch:='A';
      11:ch:='B';
      12:ch:='C';
      13:ch:='D';
      14:ch:='E';
      15:ch:='F';
      16:ch:='G';
      17:ch:='H';
      18:ch:='I';
      19:ch:='J';
      20:ch:='K';
    End;
    if t<10 then ch:=chr(48+t);
    a[j]:=ch;
    k:=k div b;
  End;
End;

Procedure chan(k:longint);
Var
  i,t:longint;
  ch:char;
Begin
  fillchar(c,sizeof(c),0); l:=0;
  while k>0 do
  Begin
    inc(l);
    t:=k mod b;
    case t of
      10:ch:='A';
      11:ch:='B';
      12:ch:='C';
      13:ch:='D';
      14:ch:='E';
      15:ch:='F';
      16:ch:='G';
      17:ch:='H';
      18:ch:='I';
      19:ch:='J';
      20:ch:='K';
    End;
    if t<10 then ch:=chr(48+t);
    c[l]:=ch;
    k:=k div b;
  End;
End;

Function ok(k:longint):boolean;
Var
  i:longint;
Begin
  for i:=1 to k div 2 do
    if a[i]<>a[k+1-i] then exit(false);
  exit(true);
End;

Begin
  innt;
  readln(b);
  for i:=1 to 300 do
  Begin
    num:=sqr(i);
    change(num);
    if ok(j) then
    Begin
      chan(i);
      for p:=l downto 1 do
        write(c[p]);
      write(' ');
      for k:=1 to j do
        write(a[k]);
      writeln;
    End;
  End;
  outt;
End.
posted @ 2012-02-19 10:46  你滴韩王  阅读(246)  评论(0)    收藏  举报