写一个程序,给定一个N(2<=N<=10,N=16)进制数M pascal

来源:百度知道 编辑:UC知道 时间:2024/06/24 17:18:05
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
例如:给定一个10进制数56,将56加56(即把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!”

var
n:longint;
x:string;
m,f:array[1..10000]of longint;
i,j,ans,long:longint;
Begin
readln(n);
readln(x);
j:=length(x);
for i:=1 to length(x)do
begin
case x[i] of
'A':m[j]:=10;
'B':m[j]:=11;
'C':m[j]:=12;
'D':m[j]:=13;
'E':m[j]:=14;
'F':m[j]:=15;
else m[j]:=ord(x[i])-ord('0');
end;
dec(j);
end;
f:=m; long:=length(x);
while true do
begin
inc(ans);
if ans=31 then
begin
write('Impossible!');
halt;
end;
for i:=1 to 100 do
begin
j:=long-i+1;
inc(f[i],m[j]);
end;
for i:=1 to long do
begin
inc(f[i+1],f[i] div n);
f[i]:=f[i] mod n;
end;
if f[long+1]>0 then inc(