[题目描述]
Palindromic Squares
回文平方数
回文数是指从左向右念和从右像做念都一样的数。如12321就是一个典型的回文数。
给定一个进制B(2<=B<=20十进制),输出所有的大于等于1小于等于300且它的平方用B进制表示时是回文数的数。用’A’,’B’……表示10,11等等。
PROGRAM NAME: palsquare
INPUT FORMAT
共一行,一个单独的整数B(B用十进制表示)。
SAMPLE INPUT (file palsquare.in)
10
OUTPUT FORMAT
每行两个数字,第二个数是第一个数的平方,且第二个数是回文数。(注意:这两个数都应该在B那个进制下)
SAMPLE OUTPUT (file palsquare.out)
1 1
2 4
3 9
11 121
22 484
26 676
101 10201
111 12321
121 14641
202 40804
212 44944
264 69696
2 4
3 9
11 121
22 484
26 676
101 10201
111 12321
121 14641
202 40804
212 44944
264 69696
[解题思路]
朴素枚举。
重点是转进制,常量定义一个数组表示不同进制下数的表示,再用短除法模拟进制转换即可。
[Code]
{
ID: zane2951
PROG: palsquare
LANG: PASCAL
}
program palsquare;
const
word: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
k,len,i:longint;
s:ansistring;
//---------modify----------
function modify(x:longint):ansistring;
var
ss:ansistring;
p:longint;
begin
ss:='';
while x>0 do
begin
p:=x mod k;
x:=x div k;
inc(len);
ss:=word[p]+ss;
end;
exit(ss);
end;
//---------check-----------
function check(s:ansistring):boolean;
var
i:longint;
begin
for i:=1 to len>>1 do
if s[i]<>s[len-i+1] then exit(false);
exit(true);
end;
//----------main-----------
begin
assign(input,'palsquare.in'); reset(input);
assign(output,'palsquare.out'); rewrite(output);
readln(k);
for i:=1 to 300 do
begin
len:=0;
s:=modify(i*i);
if check(s) then writeln(modify(i),'':1,s);
end;
close(input); close(output);
end.