| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1776 人关注过本帖
标题:神奇数字6174,无从下手
只看楼主 加入收藏
winglesswu
Rank: 1
等 级:新手上路
帖 子:92
专家分:0
注 册:2013-1-28
结帖率:71.88%
收藏
已结贴  问题点数:20 回复次数:8 
神奇数字6174,无从下手
Kaprekar发现了一个神奇数字,即6174猜想 ,1955年,卡普耶卡(D.R.Kaprekar)研究了对四位数的一种变换:任给出四位数k0,用它的四个数字由大到小重新排列成一个四位数m,再减 去它的反序数rev(m),得出数k1=m-rev(m),然后,继续对k1重复上述变换,得数k2.如此进行下去,卡普耶卡发现,无论k0是多大的四位 数, 只要四个数字不全相同,最多进行7次上述变换,就会出现四位数6174.
这四位数字是在1000到9999,而且至少两个数字是不同的。该猜想才成立。例如:

  Step : 1 ==> 4 digit number is 5620.

  Step : 2 ==> Arrange decreasing order : 6520 (从大到小排列)

  Step : 3 ==> Arrange increasing order : 0256 (从小到大排列)

  Step : 4 ==> Subtract the smaller number from the larger number :

                6520 - 0256 = 6264 (大数减小数)

  Step : 5 ==> Take the final result and repeat the steps 2, 3, and 4 until

            you get the repetition of 6174. (把6264再重复2 3 4 直到得到6174)

 

  You will get this result:

     6264 = 6642 - 2466 = 4176

     4176 = 7641 - 1467 = 6174

     6174 = 7641 - 1467 = 6174

这个似乎涉及到bubble sort。看似很复杂,请论坛的大侠指点,小弟感激不尽。

   

搜索更多相关主题的帖子: number 
2013-02-19 22:41
为你而来。
Rank: 2
等 级:论坛游民
帖 子:21
专家分:36
注 册:2013-2-18
收藏
得分:4 
好难哦!看不懂啊!是些什么哦
2013-02-19 22:57
bok002121
Rank: 2
等 级:论坛游民
帖 子:90
专家分:26
注 册:2012-11-11
收藏
得分:4 
看起来可以函数递归
2013-02-19 23:36
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:4 
楼主想问什么?这是个大问题!

难道是想问“bubble sort”?4个数排序,没有再比硬编码的算法快了,直接用if比较吧
2013-02-20 09:00
PengDavi
Rank: 2
等 级:论坛游民
帖 子:3
专家分:16
注 册:2013-2-19
收藏
得分:4 
可以将数字转换为字符串,翻转之后转换为数字,做运算!
2013-02-20 10:33
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
无聊,所以用标准C语法写一个,gcc4.7.2加编译参数-std=c99编译测试通过

程序代码:
#include <stdio.h>

static inline void sort2( int* restrict a, int* restrict b )
{
    if( *a <= *b ) return;
    int tmp = *a;
    *a = *b;
    *b = tmp;
}
static inline void sort4( int buf[static 4] )
{
    sort2( buf+0, buf+1 );
    sort2( buf+2, buf+3 );
    sort2( buf+0, buf+2 );
    sort2( buf+1, buf+3 );
    sort2( buf+1, buf+2 );
}
void foo( int n )
{
    while( n!=6174 && n!=0 )
    {
        int buf[4] = { n/1000%10, n/100%10, n/10%10, n/1%10 };
        sort4( buf );
        int a = buf[3]*1000 + buf[2]*100 + buf[1]*10 + buf[0]*1;
        int b = buf[0]*1000 + buf[1]*100 + buf[2]*10 + buf[3]*1;
        printf( "%04d = %04d - %04d = %04d\n", n, a, b, a-b );
        n = a - b;
    }
    printf( "\n" );
}

int main()
{
    foo( 5620 );
    foo( 6666 );

    return 0;
}

2013-02-20 11:18
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:4 
三位数也存在这样的规律,那个数字是495。可以用下面的代码验证一下。
程序代码:
#include<stdio.h>

int rev(int a)
{
    int d[10], max, min, t, i;
    for(t = a, a = 0; t != a;)
    {
        a = t;
        for(i = 0; i < 10; d[i++] = 0);
        for(i = a; i; i /= 10) d[i % 10]++;
        for(max = 0, i = 9; i >= 0; i--)
            for(t = d[i]; t--; max = max * 10 + i);
        for(min = 0, i = 1; i <= 9; i++)
            for(t = d[i]; t--; min = min * 10 + i);
        printf("%d = %d - %d = %d\n", a, max, min, t = max - min);
    }
    return a;
}
   
int main()
{
    int a;
    while(scanf("%d", &a) != EOF)
        rev(a);
    return 0;
}

重剑无锋,大巧不工
2013-02-20 19:18
winglesswu
Rank: 1
等 级:新手上路
帖 子:92
专家分:0
注 册:2013-1-28
收藏
得分:0 
以下是引用beyondyf在2013-2-20 19:18:10的发言:

三位数也存在这样的规律,那个数字是495。可以用下面的代码验证一下。
#include
 
int rev(int a)
{
    int d[10], max, min, t, i;
    for(t = a, a = 0; t != a;)
    {
        a = t;
        for(i = 0; i < 10; d = 0);
        for(i = a; i; i /= 10) d10]++;
        for(max = 0, i = 9; i >= 0; i--)
            for(t = d; t--; max = max * 10 + i);
        for(min = 0, i = 1; i <= 9; i++)
            for(t = d; t--; min = min * 10 + i);
        printf("%d = %d - %d = %d\n", a, max, min, t = max - min);
    }
    return a;
}
   
int main()
{
    int a;
    while(scanf("%d", &a) != EOF)
        rev(a);
    return 0;
}

版主,这个程序超出了我的理解范围,能简单解释一下吗?

[ 本帖最后由 winglesswu 于 2013-3-3 11:54 编辑 ]
2013-03-03 05:10
hczsea
Rank: 2
等 级:论坛游民
帖 子:129
专家分:68
注 册:2007-10-23
收藏
得分:0 
来个笨方法。
#include <math.h>
#include <stdio.h>

int dd[4];
int salt[4];

int checknum(int* aa)
{
    int i,j;
    int n;

    for (i=0; i<2; i++)
    {
        n = 0;
        for (j=i+1;j<4;j++)
        {
            if (aa[i] == aa[j])
            {
                n++;
            }

            if (n >= 3)
            {
                return 1;
            }
        }
    }

    return 0;
}

void salt_n(int* aa)
{
    int i,j;
    int max,pos;
   
    for (i=0; i<3; i++)
    {
        max = 0;
        for (j=i; j<4; j++)
        {
            if (aa[j] > max)
            {
                max = aa[j];
                pos = j;
            }
        }
        
        j = aa[pos];
        aa[pos] = aa[i];
        aa[i] = j;
        salt[i] = j;
    }
    salt[3] = aa[3];
}

int main(void)
{
    int n;
    int num1,num2,dlt;
    int sign;
   
    while (1)
    {
        sign = 0;
        printf("Input 0-exit\n");
        printf("else Input a num (1-9999) and at least two digit different\n");
        printf("Input a num:");
        scanf("%d",&n);
        
        if (n >= 10000)
        {
            printf("%d upper 9999\n",n);
        }
        else if (n == 0)
        {
            return 1;
        }
        else
        {
            dd[0] = n%10;
            dd[1] = (n%100)/10;
            dd[2] = (n%1000)/100;
            dd[3] = n/1000;
            
            if (checknum(dd) == 1)
            {
                printf("%d no diff digits\n",n);
                return 0;
            }
            else
            {
                dlt = 0;
                while (sign != 2)
                {
                    salt_n(dd);
                    num1 = salt[0]*1000+salt[1]*100+salt[2]*10+salt[3];
                    num2 = salt[3]*1000+salt[2]*100+salt[1]*10+salt[0];
                    dlt = num1 - num2;
                    
                    printf("%d - %d = %d\n",num1,num2,dlt);

                    dd[0] = dlt%10;
                    dd[1] = (dlt%100)/10;
                    dd[2] = (dlt%1000)/100;
                    dd[3] = dlt/1000;

                    if (dlt == 6174)
                    {
                        sign++;
                    }
                }
                printf("There is 6174,circling..\n");
            }
        }
    }
    return 1;
}
2013-03-05 13:36
快速回复:神奇数字6174,无从下手
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030041 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved