[题目描述]
Dual Palindromes
双重回文数
如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做“回文数”。例如,12321就是一个回文数,而77778就不是。当然,回文数的首和尾都应是非零的,因此0220就不是回文数。
事实上,有一些数(如21),在十进制时不是回文数,但在其它进制(如二进制时为10101)时就是回文数。
编一个程序,从文件读入两个十进制数
- 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
[解题思路]
朴素枚举。
和上题基本一样。每次检查一个数,判断是否合法,找到N个就Break。
[Code]
{
ID: zane2951
PROG: dualpal
LANG: PASCAL
}
program dualpal;
const
word:array[0..9] of char=('0','1','2','3','4','5','6','7','8','9');
var
n,st,up,len,i:longint;
//---------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;
//---------modify----------
function modify(k,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;
//-----------run-----------
function run(x:longint):boolean;
var
t,i:longint;
s:ansistring;
begin
t:=0;
for i:=2 to 10 do
begin
len:=0;
s:=modify(i,x);
if check(s) then inc(t);
end;
if t>=2 then exit(true) else exit(false);
end;
//----------main-----------
begin
assign(input,'dualpal.in'); reset(input);
assign(output,'dualpal.out'); rewrite(output);
readln(n,st); up:=0;
for i:=st+1 to maxlongint do
if run(i) then
begin
writeln(i);
inc(up);
if up=n then break;
end;
close(input); close(output);
end.