遵义水务投资集团公司:谁帮我解决这个题?

来源:百度文库 编辑:杭州交通信息网 时间:2024/04/28 23:13:21
回文数
若一个数(首位不为零)从左到右读与从右到左读都是一样,我们就将其称之为回文数。例如:给定一个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<=10,N=16)进制数M,求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出"Impossible!"
样例:
INPUT
N=9 M=87
OUTPUT
STEP=6

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.

楼上的,你用的啥子语言哦?