一道很简单的计算题,计算max-min
一道很简单的计算题,
计算max-min
题目描述]:
对于任意一个输入的四位不全相同的自然数n,经过下列运算后总能得到6174:
(1)将这四位数各位数字得新排列形成一个最大的数max;
(2)将这四位数各位数字得新排列形成一个最小的数min;
(3)计算max-min的值并赋给n,如果n不是6174,再进行上述运算。
如输入n=7225
第1次运算 max=7552 min=2257 n=5265
第2次运算max=6552 min=2556 n=3996
第3次运算max=9963 min=3699 n=6264
第4次运算max=6642 min=2466 n=4176
max=7641 n=1467 n=6174
[算法分析]:
这纯粹是一个计算的过程,究竟为什么总能得到6174,不要你来证明,只是让你验证而已,程序运行时输出每一步的卡布列克运算,直到6174为止,整个程序可以用while或repeat循环结构。
算法的难点是如何将n拆分开来并构造最大数max和最小数min,由于数字较少,并不一定要用到排序算法。将n拆分为4个0-9间的数,定义一个数组b,存放0到9各用了几次,构造max和min时依次使用b数组的值。
[参考程序]:
var n,i,j,h,max,min:integer;
b:array[0..9] of byte;
begin
readln(n);
repeat
for i:=0 to 9 do b[i]:=0;
while n>0 do
{拆分n}
begin
b[n mod 10]:=b[n mod 10]+1;
n:=n div 10;
end;
max:=0; min:=0; h:=1;
for i:=9 downto 0 do {构造最大数和最小数}
for j:=1 to b[i] do
begin
min:=i*h+min;
max:=max*10+i;
h:=h*10;
end;
n:=max-min;
writeln(max,'-',min,'=',n); {输出一次卡布列克运算}
until n=6174;
end.
{说明:上述程序中并没有考虑输入数据的正确性,可以自己来完善对输入数据的判定。如果输入的n是四位完全相同的自然数,则max和min相同,结果为0,可以将until的条件改为(n=6174)
or (n=0)。}
[练习]:
五位的自数数进行卡布列克运算,结果总能得到一些五位自然数中的一个(0可以看成是五位全相同的一个),编程输出所有可能的得到这些自然数。(运行时间要求小于0.5秒)
最大值与最小值得差
这个问题很难,其结果还是max
这是脑筋急转弯吗?。 max是最大值的英文缩写,min是最小值的英文缩写。
以我的智商只能回答到这了。。。