您的位置:首页 > 其它

JZOJ1245.【USACO题库】1.2.5 Dual Palindromes双重回文数

2017-03-28 14:38 435 查看
题目描述

如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做“回文数”。例如,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

输入

输出

样例输入

样例输出

数据范围限制

这题和USACO另外那道回文平方数差不了太多

直接转一下进制,从s+1开始,直接找满足条件的数输出

说白了就是暴力

代码:

var
n,i,j,t,s,x:longint;
st:ansistring;
function f(x,y:longint):ansistring;
var
st,s:ansistring;
begin
st:='';
repeat
st:=chr(j+ord('0'))+st;
x:=x div y;
until x=0;
f:=st;
end;
function judge(s:ansistring):boolean;
var
i,len:longint;
begin
judge:=true;
len:=length(s);
for i:=1 to len div 2 do
if s[i]<>s[l-i+1] then exit(false);
end;
begin
readln(n,s);
t:=s+1;
repeat
j:=0;
for i:=2 to 10 do
begin
st:=f(t,i);
if judge(st) then inc(j);
if j=2 then
begin
writeln(t);
dec(n);
break;
end;
end;
inc(t);
until n=0;
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: