題目:[NOIP1999]回文數題目描述若一個數(首位不為零)從左向右讀與從右向左讀都一樣,我們就將其稱之 題目:[NOIP1999]回文數 題目描述 若一個數(首位不為零)從左向右讀與從右向左讀都一樣,我們就將其稱之為回文數. 例如:給定一個10進制數56,將56加65(即把56從右向左讀),得到121是一個回文數. 又如:對於10進制數87: STEP1:87+78 = 165 STEP2:165+561 = 726 STEP3:726+627 = 1353 STEP4:1353+3531 = 4884 在這裡的一步是指進行了一次N進制的加法,上例最少用了4步得到回文數4884. 輸入格式 第一行是整數N(2

題目:[NOIP1999]回文數題目描述若一個數(首位不為零)從左向右讀與從右向左讀都一樣,我們就將其稱之 題目:[NOIP1999]回文數 題目描述 若一個數(首位不為零)從左向右讀與從右向左讀都一樣,我們就將其稱之為回文數. 例如:給定一個10進制數56,將56加65(即把56從右向左讀),得到121是一個回文數. 又如:對於10進制數87: STEP1:87+78 = 165 STEP2:165+561 = 726 STEP3:726+627 = 1353 STEP4:1353+3531 = 4884 在這裡的一步是指進行了一次N進制的加法,上例最少用了4步得到回文數4884. 輸入格式 第一行是整數N(2

本題也很簡單,只是考查了一些基本程式設計能力,沒有什麼難度可言.只要細心,本題的分是可以輕鬆拿到手的.
這裡數採用字串表示(其他方法當然也可以),因為處理方便.
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.
沒問題請採納,有問題追問.