回 帖 发 新 帖 刷新版面

主题:数字黑洞

对于所有的数字不完全相同的三位数(不够三位数的前面补零也当成是三位数)。我们定出如下计算规则:用这个三位数的三个数字可组成的最大数减去可组成的最小数,则得到一个新的三位数;对新的三位数还按照上面的规则继续算下去,最后会发现,我们陷入一个死循环里,或者说是跌入了一个数的黑洞里。用具体例子说明。比如从三位数123开始,计算如下321-123=198;981-189=792;972-279=693;963-369=594;954-459=495;954-459=495;…. 从其他的任何三位数开始,最终也都会停止在495,我们把495叫做三位数的黑洞。类似地也存在着一个由一个数组成的四位数的黑洞。请编程序把它找出来。

回复列表 (共7个回复)

沙发

就是1个很大的while do循环:

板凳

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 楼

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 楼

很偷懒的用数组做

5 楼

还有一个优化:
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 楼

回5楼:那答案就是4716咯
7641-1467=6174
但好像又不是哦~~(6174不等于4716)

7 楼

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.

我来回复

您尚未登录,请登录后再回复。点此登录或注册