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.
浙公网安备 33010602011771号