题目: | 回文平方数 | |
来源: | Usaco1.2.4 | |
题目大意: | 1到300之间的在B进制下平方为回文的输出该B进制数和其平方数 | |
数据范围: | 2<=B<=20 | |
样例: |
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 |
做题思路: | 无比感叹的说,原来辗转相除这么有用啊。。用辗转相除来转换进制,再判断是否是回 文,判断回文:从两头向中间比较好用因为不用管奇偶 | |
知识点: | 进制转换/辗转相除、判断回文、模拟 |
{
ID:Dount Nameless
TASK:palsquare
LANG:PASCAL
}
var
a,b:array[0..90000]of longint;
n,i,j,x,k,t:longint;
function pd(x:longint):boolean;{<判断回文>}
var
i,j:longint;
begin
i:=1;j:=x;
while (a[i]=a[j])and(i<=j) do
begin
inc(i);dec(j);
end;
ifi>=j then exit(true);
exit(false);
end;
begin
assign(input,'palsquare.in');reset(input);
assign(output,'palsquare.out');rewrite(output);
readln(n);
fori:=1 to 300 do
begin
x:=sqr(i);
j:=0;
while x>0 do{<辗转>}
begin
inc(j);
a[j]:=x mod n;
x:=x div n;
end;
ifpd(j) then
begin
x:=i;
k:=0;
while x>0 do{<辗转>}
begin
inc(k);
b[k]:=x mod n;
x:=x div n;
end;
for t:=k downto 1 do{<倒着输出,因为是倒着辗转的>}
if b[t]>9 then write(chr(b[t]-9+64))
else write(b[t]);
write(' ');
for t:=j downto 1 do
if a[t]>9 then write(chr(a[t]-9+64))
else write(a[t]);
writeln;
end;
end;
close(input);close(output);
end.
题目来源:
http://ace.delos.com/usacoprob2?a=RexmW8CclSt&S=palsquare