pascal 回文数问题,急,50高分!

来源:百度知道 编辑:UC知道 时间:2024/06/30 06:06:26
写一个程序,给个数m,(这个数为1<n<13 或n=16进制)求最少经几步可得回文数。如在30步内不能得到回文数,则输出“?”
若一个数(首位不为零)从左向右读与从右向左读都是一样的,就称为回文数。如:一个数56,将56加65(即把56从右向左读),得到121是一个回文数。
写一个程序,给定一个数m与n进制,求最少经过几步可得回文数。如在30步内不能得到回文数,则输出“?”

既然lz出这么高的分,我觉得让lz明白这个程序会更好,所以给出了程序和解释

将数串s转化为整数数组m
设数串s=s1¨sp,串长为p。其中si为第p-i+1位n进制数(1≤i≤p)。我们将s转化为整数数组m=m[p]¨m[1],其中m[i]对应第i位n进制数。
type
mtype=array[1..100]of integer;
var
m:mtype;
按下述方法将s转化为整数数组m:
p←length(s); /*计算s的串长*/
for i←1 to p do /*从最高位开始计算整数数组m*/
{ k←p-i+1; /*计算si对应于的m数组下标*/
case s[i] of /*转换si*/
’a’..’f’:m[k]←10+ord(s[i])-ord(’a’);
’0’..’9’:m[k]←ord(s[i])-ord(’0’);
else 输出错误信息并退出程序;
};{case}
};{for}
判别整数数组m是否为回文数
function check (m: mtype) :boolean;/*若整数数组m为回文数,则返回true,否则返回false*/
var i:integer;
{ check←false;
for i←1to do /*返回m非回文数标志*/
if m[i] ≠m[p-i+1] then exit;
check←true; /*返回m为回文数标志*/
};{check}
n进制加法运算
整数数组m1与其反序数m2进行n进制加法运算,得到结果m1
Proc solve(var m1: mtype);
var m2: mtype;
{ for i←1 to p do m2[i]←m1[p-i+1];/*计算反序数m2*/
for i←1 to p