主题:数字黑洞
QBfire
[专家分:50] 发布于 2009-07-27 10:42:00
对于所有的数字不完全相同的三位数(不够三位数的前面补零也当成是三位数)。我们定出如下计算规则:用这个三位数的三个数字可组成的最大数减去可组成的最小数,则得到一个新的三位数;对新的三位数还按照上面的规则继续算下去,最后会发现,我们陷入一个死循环里,或者说是跌入了一个数的黑洞里。用具体例子说明。比如从三位数123开始,计算如下321-123=198;981-189=792;972-279=693;963-369=594;954-459=495;954-459=495;…. 从其他的任何三位数开始,最终也都会停止在495,我们把495叫做三位数的黑洞。类似地也存在着一个由一个数组成的四位数的黑洞。请编程序把它找出来。
回复列表 (共7个回复)
沙发
tzhlryy [专家分:270] 发布于 2009-08-01 10:10:00
就是1个很大的while do循环:
板凳
tzhlryy [专家分:270] 发布于 2009-08-06 11:21:00
var
n,t,i,x,j:integer;
max,min:array[1..5] of integer;
f:boolean;
begin
read(n);
for i:=1 to 4 do
begin
max[i]:=n mod 10;
n:=n div 10;
min[5-i]:=max[i]
end;
for i:=1 to 4 do
for j:=1 to 4 do
begin
if max[i]<max[j] then
begin
t:=max[i];
max[i]:=max[j];
max[j]:=t;
end;
if min[i]>min[j] then
begin
t:=min[i];
min[i]:=min[j];
min[j]:=t;
end;
end;
f:=true;t:=0;
3 楼
tzhlryy [专家分:270] 发布于 2009-08-06 11:22:00
while (f) do
begin
x:=t;
t:=(max[1]*1000+max[2]*100+max[3]*10+max[4])-(min[1]*1000+min[2]*100+min[3]*10+min[4]);
if x=t then f:=true else
begin
n:=t;
for i:=1 to 3 do
write(max[i]);
writeln(max[4]);
for j:=1 to 4 do
write(min[i]);
end;
for i:=1 to 4 do
begin
max[i]:=n mod 10;
n:=n div 10;
min[5-i]:=max[i]
end;
for i:=1 to 4 do
for j:=1 to 4 do
begin
if max[i]<max[j] then
begin
t:=max[i];
max[i]:=max[j];
max[j]:=t;
end;
if min[i]>min[j] then
begin
t:=min[i];
min[i]:=min[j];
min[j]:=t;
end;
end;
end;
write(n);
end.
4 楼
tzhlryy [专家分:270] 发布于 2009-08-06 11:22:00
很偷懒的用数组做
5 楼
tzhlryy [专家分:270] 发布于 2009-08-12 18:11:00
还有一个优化:
var
c,t:array[1..4] of integer;
i,j,temp,step:integer;
s:array[1..4] of char;
begin
for i:=1 to 4 do read(s[i]);
readln;
close(input);
for i:=4 downto 1 do c[i]:=ord(s[5-i])-ord('0');
step:=0;
while (c[1]<>4) or (c[2]<>7) or (c[3]<>1) or (c[4]<>6) do
begin
for i:=1 to 3 do
for j:=i+1 to 4 do
if c[i]>c[j] then begin temp:=c[i]; c[i]:=c[j]; c[j]:=temp end;
for i:=1 to 4 do t[i]:=c[5-i];
for i:=1 to 4 do
begin
c[i]:=c[i]-t[i];
j:=i;
while c[j]<0 do
begin
c[j]:=c[j]+10;
j:=j+1;
c[j]:=c[j]-1;
end;
end;
step:=step+1
end;
writeln(step);
end.
6 楼
abcwuhang [专家分:1840] 发布于 2009-08-20 17:01:00
回5楼:那答案就是4716咯
7641-1467=6174
但好像又不是哦~~(6174不等于4716)
7 楼
abcwuhang [专家分:1840] 发布于 2009-08-26 17:57:00
vijos1024原题:
program vijos1024;
var m:int64;
st:string;
a:array [1..100000] of int64;
procedure qsort(l,r:integer);
var i,j,mid:integer;
ch:char;
begin
i:=l;
j:=r;
mid:=ord(st[(l+r) div 2])-ord('0');
while i<=j do
begin
while ord(st[i])-ord('0')<mid do
inc(i);
while ord(st[j])-ord('0')>mid do
dec(j);
if i<=j then
begin
ch:=st[i];
st[i]:=st[j];
st[j]:=ch;
i:=i+1;
j:=j-1;
end;
end;
if l<j then qsort(l,j);
if i<r then qsort(i,r);
end;
procedure main;
var st2:string;
i,l,top,code:longint;
j,k:int64;
flag:boolean;
begin
a[1]:=m;
top:=1;
flag:=true;
while flag do
begin
str(m,st);
qsort(1,length(st));
st2:='';
for i:=length(st) downto 1 do
insert(copy(st,i,1),st2,length(st2)+1);
val(st,j,code);
val(st2,k,code);
m:=k-j;
for l:=1 to top do
if a[l]=m then
begin
for i:=l to top do
write(a[i],' ');
writeln;
flag:=false;
end;
if flag then
begin
top:=top+1;
a[top]:=m;
end;
end;
end;
begin
while not(eof) do
begin
readln(m);
main;
end;
end.
我来回复