2007/01/08

24

神秘的数字6174

elfox , 09:25 pm / 9,257 pv / 分享到微博

神秘的数字6174

1949年印度数学家D. R. Kaprekar 研究出一种四位数的变换:任意列出4个自然数(不能全部相同,如1111、2222),把这四个数字组成的最大四位数与最小四位数相减,得到的四个数字再用相同方式相减法(不足四位补0),几轮减下来最后得到的数字一定是6174

后来人们把这个问题称为‘6174 问题’或‘Kaprekar 变幻’。

比如:

5200 - 0025 = 5175
7551 - 1557 = 5994
9954 - 4599 = 5355
5553 - 3555 = 1998
9981 - 1899 = 8082
8820 - 0288 = 8532
8532 - 2358 = 6174
7641 - 1467 = 6174

链接 | 来源

已有24条评论[ 上 ] [ 下 ]

  1. 我我神 @ 2007-01-09 15:15:29 #1

    有点意思,很有技术含量

    oo (0) / xx (0)
  2. vampire @ 2007-01-09 20:03:33 #2

    确实神奇

    oo (0) / xx (0)
  3. 天下有敌|lichzy@Blog » 神奇数字"6174” @ 2007-01-11 14:16:36 #3

    [...] 来自:http://jandan.net/2007/01/08/mysterious-number-6174-2.html.我认为很关键的问题是6174本身也满足这一定律,很佩服这位高人怎样找到这个数字,并且为什么确认一定能找到的。 归类于: 知识道理 — lichzy @ 2:16 pm [...]

    oo (0) / xx (0)
  4. nings @ 2007-01-30 23:26:36 #4

    经测试不是伪科学

    oo (0) / xx (0)
  5. 火星人 @ 2007-07-24 16:38:44 #5

    这是可以经过数学证明出来的,哪位数学达人能给出证明过程???

    oo (0) / xx (0)
  6. sibylkuo @ 2009-02-01 21:15:47 #6

    三位数也有:495

    五位数没有单独的一个数,但有两个死循环……

    oo (1) / xx (1)
  7. K.T @ 2009-02-06 08:47:56 #7

    6+1+7+4=4+5+9=18

    oo (0) / xx (0)
  8. 周拾柒 @ 2009-03-24 04:14:45 #8

    有什么意义?

    oo (0) / xx (0)
  9. 冷血 @ 2009-04-05 13:46:57 #9

    1000-0001=999呵呵没有6174
    2580-0258=2332呵呵也没有哦

    oo (1) / xx (6)
  10. 冷血 @ 2009-04-05 13:52:10 #10

    呵呵点错了是2322不好意

    oo (0) / xx (1)
  11. z @ 2009-06-08 18:51:20 #11

    证:四位数总共有104=10000个,其中除去四个数字全相同的,余下104-10=9990个数字不全相同.我们首先证明,变换T把这9990个数只变换成54个不同的四位数.
      设a、b、c、d是M的数字,并令:
      a≥b≥c≥d
      因为它们不全相等,上式中的等号不能同时成立.我们计算T(M)
      M(减)=1000a+100b+10c+d
      M(增)=1000d+100c+10b+a
      T(M)= D1= M(减)-M(增)=1000(a-d)+100(b-c)+10(c-b)+d-a=999(a-d)+90(b-c)
      我们注意到T(M)仅依赖于(a-d)与(b-c),因为数字a,b,c,d不全相等,因此由a≥b≥c≥d可推出;a-d>0而b-c≥0.
      此外b、c在a与d之间,所以a-d≥b-c,这就意味着a-d可以取1,2,…,9九个值,并且如果它取这个集合的某个值n,b-c只能取小于n的值,至多取n.
      例如,若a-d=1,则b-c只能在0与1中选到,在这种情况下,T(M)只能取值:
      999×(1)+90×(0)=0999
      999×(1)+90×(1)=1089
      类似地,若a-d=2, T(M)只能取对应于b-c=0,1,2的三个值.把a-d=1,a-d=2,…,a-d=9的情况下b-c所可能取值的个数加起来,我们就得到2+3+4+…+10=54
      这就是T(M)所可能取的值的个数.在54个可能值中,又有一部分是数码相同仅仅是数位不同的值,这些数值再变换T(M)中都对应相同的值(数学上称这两个数等价),剔除等价的因数,在T(M)的54个可能值中,只有30个是不等价的,它们是:
      9990,9981,9972,9963,9954,9810,9711,9621,9531,9441,8820,8730,8721,8640,8622,8550,
      8532,8442,7731,7641,7632,7551,7533,7443,6642,6552,6543,5553,5544.
      对于这30个数逐个地用上述法则把它换成最大与最小数的差,至多6步就出现6174这个数.证毕.

    oo (10) / xx (0)
  12. 小饼子的媳妇儿 @ 2009-06-09 17:39:36 #12

    @z: 你好强大~~~~~~~

    oo (0) / xx (0)
  13. Jerome @ 2009-12-16 18:30:33 #13

    @冷血: 应该是这样的
    1000-0001=0999
    9990-0999=8991

    8532-2358=6174

    2580-0258=2332,这个应该是8520-0258=8262(最大四位数与最小四位数相减)

    oo (0) / xx (0)
  14. 0101 @ 2010-02-13 00:13:35 #14

    我数学不好 =△=|||||||

    oo (0) / xx (0)
  15. LevenC21 @ 2010-07-19 17:36:44 #15

    哈哈,我生日是7.16。。。

    oo (0) / xx (2)
  16. 江河 @ 2010-12-25 21:29:33 #16

    其实用c语言编个程序对每个四位数进行检测更方便。程序如下:(还可发现运算次数不会超过7次)
    #include
    using namespace std;
    int maxTo_min(int a);
    int minTo_max(int a);
    void main()
    {
    int Max,Min,result,steps;
    for(int i=1000;i<=9999;i++)
    {
    if(i%1111!=0)
    { Max=i;
    Min=i;
    steps=0;
    result=1000;
    cout<<”number:”<<i<<endl;
    while(result!=6174)
    {

    Max=maxTo_min(Max);
    Min=minTo_max(Min);
    cout<<”Max=”<<Max<<endl;
    cout<<”Min=”<<Min<<endl;
    result=Max-Min;
    cout<<”result=”<<result<<endl;
    cout<<result<<”=”<<Max<<”-”<<Min<<endl;
    Max=result;
    Min=result;
    steps++; //运算次数
    }

    cout<<”Times of subtract:”<<steps<<endl;
    cout<<endl;

    }

    }
    }

    int maxTo_min(int a) //按位从大到小排列子程序
    {
    int i[4],temp;

    i[0]=a/1000;
    i[1]=a/100-10*i[0];
    i[2]=a/10-100*i[0]-10*i[1];
    i[3]=a%10;
    for(int n=0;n<4;n++)
    {for(int j=0;j<3;j++)
    {
    if(i[j]<=i[j+1])
    {temp=i[j];
    i[j]=i[j+1];
    i[j+1]=temp;
    }
    }
    }
    a=i[0]*1000+i[1]*100+i[2]*10+i[3];
    return a;
    }

    int minTo_max(int a) //按位从小到大排列子程序
    {
    int i[4],temp;
    i[0]=a/1000;
    i[1]=a/100-10*i[0];
    i[2]=a/10-100*i[0]-10*i[1];
    i[3]=a%10;
    for(int n=0;n<4;n++)
    {for(int j=0;j=i[j+1])
    {temp=i[j];
    i[j]=i[j+1];
    i[j+1]=temp;
    }
    }
    }
    a=i[0]*1000+i[1]*100+i[2]*10+i[3];
    return a;
    }

    oo (1) / xx (1)
  17. 江河 @ 2010-12-25 21:31:02 #17

    @z: 至多7次

    oo (0) / xx (0)
  18. 削着苹果走路 @ 2011-06-01 12:26:48 #18

    最讨厌数学了= =

    oo (0) / xx (0)
  19. 神秘代码 @ 2011-08-22 11:25:11 #19

    天啊,你们好牛啊,能想到用c语言来证明的就更牛了。

    oo (0) / xx (0)
  20. 月夜星光 @ 2011-08-27 23:43:15 #20

    所给的数少一个:6444

    oo (0) / xx (0)
  21. HKM @ 2011-10-07 18:23:23 #21

    1000好像没有

    oo (0) / xx (0)
  22. HKM @ 2011-10-07 18:24:38 #22

    我的生日是6月17日幸运数字是4!!!怎么这么巧?!????????

    oo (0) / xx (0)
  23. 鬼泣4→尼禄 @ 2011-11-12 23:24:38 #23

    这个是数字黑洞……

    oo (0) / xx (0)
  24. djck @ 2012-02-03 17:44:45 #24

    人才啊~~~

    oo (0) / xx (0)

填写称呼和邮箱即可发布评论[ 上 ] [ 优 ] [ IMG ]