回 帖 发 新 帖 刷新版面

主题:请教:这个简单的循环为何无法进行(6174数学黑洞)????

最近见鬼了,小程序也写不对

[em10][em10][em10][em10][em10]
问题描述:一个任意四位数,把四个数字分别组成一个最大的数和一个最小的数,作差,得新的四位数,重复此过程,7次内必得6174.

要求:验证此命题

我的源代码:
program 6174;
var
  i,j,result,k,realtemp,max,min,number:integer;
  temp:array [1..4] of integer;

begin
  number:=1000;
  while number<=9999 do
    begin
    k:=0;
    temp[1]:=number div 1000;
    temp[2]:=number div 100 mod 10;
    temp[3]:=number mod 100 div 10;
    temp[4]:=number mod 10;

     repeat
       for i:=1 to 3 do
        for j:=i+1 to 4 do if temp[j]>temp[i] then
          begin
          realtemp:=temp[i];
          temp[i]:=temp[j];
          temp[j]:=realtemp;
          end;                                            {选择排序}
        max:=1000*temp[1]+100*temp[2]+10*temp[3]+temp[4];
        min:=1000*temp[4]+100*temp[3]+10*temp[2]+temp[1];
        result:=max-min;
        temp[1]:=result div 1000;
        temp[2]:=result div 100 mod 10;
        temp[3]:=result mod 100 div 10;
        temp[4]:=result mod 10;                            {拆数}
        k:=k+1;

     until result=6174;
     writeln(number,'       ',k);
     number:=number+1;
  end;
end.



大家到机子上试一下,运行到1110就不动了,我也曾把while..do换成4个从1 到10 的for ..do  ,也不行.


大家帮帮忙,顺便到我新建的群来!!!   writeln( '9035669');
[em12]

回复列表 (共13个回复)

沙发

[em8][em8]
我不知道啊
我很想帮你 可我更想有人帮我
谁能给我演示一遍pascal 的画圆图程序
我知道很简单 可是就是不会 谢谢大家

板凳


main()

{int a[N],i,j,t,sl,si,s,m,n;

m=N;

printf("in put number:");

for(j=0;j<m;j++)

scanf("%d",&a[j]);

for(n=0;n<=10;n++)

{for(i=1;i<m;i++)

for(j=0;j<m-i;j++)

if(a[j]>a[j+1])

{t=a[j];a[j]=a[j+1];a[j+1]=t;}

sl=a[3]*10*10*10+a[2]*10*10+a[1]*10+a[0];

si=a[0]*10*10*10+a[1]*10*10+a[2]*10+a[3];

s=sl-si;

printf("%d\t",s);

for(j=0;j<m;j++)

{a[j]=s%10;s=s/10;}}

}

本人已经运行没有问题

3 楼


不过你输入时注意
如果你要输入6541请一个数一个数的输并且用空格隔开或者用逗号也可以
其他数一样

4 楼

To楼主
你把 
program 6174;
删了,看看行不?

5 楼

hey大哥说漏了把
4位数。。4个不相同的数把
况且,有的不用7次,有的超过7次啊

6 楼

楼主问个问题啊:如果这个四位数是1111咋办????

7 楼

[quote]
不过你输入时注意
如果你要输入6541请一个数一个数的输并且用空格隔开或者用逗号也可以
其他数一样[/quote]

用不着,直接用字符串输入,需要运算的时候转成整数,运算结束后又转回来.我觉得这样不容易出错

8 楼

for i:=1 to 3 do
        for j:=i+1 to 4 do if temp[j]>temp[i] then
          begin
          realtemp:=temp[i];
          temp[i]:=temp[j];
          temp[j]:=realtemp;
          end;                                            {选择排序}

这是冒泡排序吧

9 楼

[quote]for&nbsp;i:=1&nbsp;to&nbsp;3&nbsp;do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;j:=i+1&nbsp;to&nbsp;4&nbsp;do&nbsp;if&nbsp;temp[j]>temp[i]&nbsp;then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;realtemp:=temp[i];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp[i]:=temp[j];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp[j]:=realtemp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{选择排序}

这是冒泡排序吧
[/quote]

据我所知这应该是选择,最原始的选择.冒泡应该是(注意差异!):
for i:=1 to (n-1) do
  for j:=(i+1) to n do
    if a[j]>a[j-1] then swap(a[j],a[j-1]);

10 楼

可以加一个READ 任意输入一个4位数  验证  
 还可以把每一步过程输出来  这样就更好了!!!
 还有 一个4位数  最多7步  绝对能运行到6174

我来回复

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