USACO-Chapter1-Section 1.2-Dual Palindromes (dualpal)
【题目描述】
如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做“回文数”。例如,12321就是一个回文数,而77778就不是。当然,回文数的首和尾都应是非零的,因此0220就不是回文数。
事实上,有一些数(如21),在十进制时不是回文数,但在其它进制(如二进制时为10101)时就是回文数。
编一个程序,从文件读入两个十进制数N (1 <= N <= 15)S (0 < S < 10000)然后找出前N个满足大于S且在两种或两种以上进制(二进制至十进制)上是回文数的十进制数,输出到文件上。
本问题的解决方案不需要使用大于32位的整型
【输入格式】
只有一行,用空格隔开的两个数N和S。
【输出格式】
N行, 每行一个满足上述要求的数,并按从小到大的顺序输出.
【输入样例】
3 25
【输出样例】
26 27 28
【思路】
和上一道题一样,都是进制问题,主意细节就能过。
【代码】
- Executing...
- Test 1: TEST OK [0.000 secs, 276 KB]
- Test 2: TEST OK [0.000 secs, 276 KB]
- Test 3: TEST OK [0.000 secs, 276 KB]
- Test 4: TEST OK [0.000 secs, 276 KB]
- Test 5: TEST OK [0.000 secs, 276 KB]
- Test 6: TEST OK [0.000 secs, 276 KB]
- Test 7: TEST OK [0.000 secs, 276 KB]
- All tests OK.
{
ID : c_CaM.19
LANG: PASCAL
TASK: dualpal
}
Program CaM(input,output);
Var
a,c:array[0..500] of char;
i,j,k,l,b,n,tot,bb,ans:longint;
Procedure innt;
Begin
assign(input,'dualpal.in'); reset(input);
assign(output,'dualpal.out'); rewrite(output);
End;
Procedure outt;
Begin
close(input);
close(output);
End;
Procedure change(k:longint);
Var
i,t:longint;
ch:char;
Begin
fillchar(a,sizeof(a),0); j:=0;
while k>0 do
Begin
inc(j);
t:=k mod b;
case t of
10:ch:='A';
11:ch:='B';
12:ch:='C';
13:ch:='D';
14:ch:='E';
15:ch:='F';
16:ch:='G';
17:ch:='H';
18:ch:='I';
19:ch:='J';
20:ch:='K';
End;
if t<10 then ch:=chr(48+t);
a[j]:=ch;
k:=k div b;
End;
End;
Function ok(k:longint):boolean;
Var
i:longint;
Begin
for i:=1 to k div 2 do
if a[i]<>a[k+1-i] then exit(false);
exit(true);
End;
Begin
innt;
readln(n,bb);
for i:=bb+1 to 500000 do
Begin
tot:=0;
for b:=2 to 10 do
Begin
change(i);
if ok(j) then
Begin
inc(tot);
if tot>=2 then
Begin
inc(ans);
writeln(i);
break;
End;
End;
End;
if ans=n then break;
End;
outt;
End.
浙公网安备 33010602011771号