题目:[NOIP1999]回文数 题目描述 若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之
1个回答

本题也很简单,只是考查了一些基本编程能力,没有什么难度可言.只要细心,本题的分是可以轻松拿到手的.

这里数采用字符串表示(其他方法当然也可以),因为处理方便.

N进制的加法是本题的重头戏,处理如下:

1)字符->数字,可以用数组来简化程序,即digit和chars数组

2)做加法,保留各位数字和进位,就想做高精度加法一样.

g是进位.

const

step:integer=0;

chars:array[0..15] of char=('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');

var

digit:array[char] of integer;

i,n,g:integer;

m,s:string;

ok:boolean;

begin

for i:=0 to 9 do digit[char(ord('0')+i)]:=i;

for i:=0 to 5 do digit[char(ord('A')+i)]:=i+10;

write('n='); readln(n);

write('m='); readln(s);

for i:=1 to length(s) do s[i]:=upcase(s[i]);

repeat

ok:=true;

for i:=1 to length(s) div 2 do

if s[i]s[length(s)+1-i] then ok:=false;

if ok then break;

inc(step);

m:=s; g:=0;

for i:=length(m) downto 1 do

begin

s[i]:=chars[(digit[m[i]]+digit[m[length(m)+1-i]]+g) mod n];

g:=(digit[m[i]]+digit[m[length(m)+1-i]]+g) div n;

end;

if g>0 then s:=chars[g]+s;

until step>=30;

if ok then

writeln('STEP=',step)

else

writeln('Impossible');

end.

没问题请采纳,有问题追问.