Dual Palindromes双重回文数
如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做“回文数”.例如,12321 就是一
个回文数,而 77778 就不是.当然,回文数的首和尾都应是非零的,因此 0220 就不是回文数.
事实上,有一些数(如 21),在十进制时不是回文数,但在其它进制(如二进制时为 10101)时就是
回文数. 11
编一个程序,从文件读入两个十进制数
N (1 <= N <= 15) S (0 < S < 10000)
然后找出前 N 个满足大于 S 且在两种以上进制(二进制至十进制)上是回文数的十进制数,输出到
文件上.
本问题的解决方案不需要使用大于 4 字节的整型变量.
PROGRAM NAME: dualpal
INPUT FORMAT
只有一行,用空格隔开的两个数N和S.
SAMPLE INPUT (file dualpal.in)
3 25
OUTPUT FORMAT
N 行, 每行一个满足上述要求的数,并按从小到大的顺序输出.
SAMPLE OUTPUT (file dualpal.out)
26
27
28
=====================================
==========================
{
ID:jie19952
PROG:dualpal
LANG:PASCAL
}
const
d:array[0..20]of char=('0','1','2','3','4','5','6','7','8','9','A',
'B','C','D','E','F','G','H','I','J','K');
var
n,s:longint;
procedure init;
begin
assign(input,'dualpal.in');
assign(output,'dualpal.out');
reset(input); rewrite(output);
end;
procedure terminate;
begin
close(input); close(output);
halt;
end;
function change(t,n:longint):string;
var
i:longint;
st:string;
begin
st:='';
while t>0 do
begin
st:=st+d[t mod n];
t:=t div n;
end;
change:='';
for i:=length(st) downto 1 do
change:=change+st[i];
end;
function check(t,n:longint):boolean;
var
st:string;
i,len:longint;
begin
check:=true;
st:=change(t,n);
len:=length(st);
for i:=1 to (len shr 1) do
if st[i]<>st[len-i+1] then exit(false);
end;
procedure main;
var
i:longint;
t,flag:longint;
begin
readln(n,s);
t:=0;
inc(s);
while t<n do
begin
flag:=0;
for i:=2 to 10 do
begin
if check(s,i) then
begin
inc(flag);
end;
if flag=2 then
begin
writeln(s);
inc(t);
break;
end;
end;
inc(s);
end;
end;
begin
init;
main;
terminate;
end.