1955年,
卡普
耶卡(D.R.Kaprekar)研究了对四位数的一种变换:任给出四位数k0,用它的四个数字由大到小重新排列成一个四位数m,再减去它的反序数rev(m),得出数k1=m-rev(m),然后,继续对k1重复上述变换,得数k2.如此进行下去,卡普耶卡发现,无论k0是多大的四位数,
只要四个数字不全相同,最多进行7次上述变换,就会出现四位数6174.例如:
k0=5298,k1=9852-2589=7263,k2=7632-2367=5265,k3=6552-2556=3996,k4=9963-3699=6264,k5=6642-2466=4176,k6=7641-1467=6174.
后来,这个问题就流传下来,人们称这个问题为"6174问题",上述变换称为 卡普 耶卡变换,简称 K 变换.
一般地,只要在0,1,2,...,9中任取四个不全相等的数字组成一个整数k0(不一定是四位数),然后从k0开始不断地作K变换,得出数k1,k2,k3,...,则必有某个m(m=<7),使得km=6174.
更一般地,从0,1,2,...,9中任取n个不全相同的数字组成一个十进制数k0(不一定是n位数),然后,从k0开始不断地做K变换,得出k1,k2,...,那么结果会是怎样的呢?现在已经知道的是:
n=2,只能形成一个循环:(27,45,09,81,63).例如取两个数字7与3,连续不断地做K变换,得出:36,27,45,09,81,27,...出现循环.
n=3,只能形成一个循环:(495).
n=4,只能形成一个循环:(6174).
n=5,已经发现三个循环:(53855,59994),(62964,71973,83952,74943),(63954,61974,82962,75933).
n=6,已经发现三个循环:(642654,...),(631764,...),(549945,...).
n=7,已经发现一个循环:(8719722,...).
n=8,已经发现四个循环:(63317664),(97508421),(83208762,...),(86308632,...)
n=9,已经发现三个循环:(864197532),(975296421,...),(965296431,...)
只要四个数字不全相同,最多进行7次上述变换,就会出现四位数6174.例如:
k0=5298,k1=9852-2589=7263,k2=7632-2367=5265,k3=6552-2556=3996,k4=9963-3699=6264,k5=6642-2466=4176,k6=7641-1467=6174.
后来,这个问题就流传下来,人们称这个问题为"6174问题",上述变换称为 卡普 耶卡变换,简称 K 变换.
一般地,只要在0,1,2,...,9中任取四个不全相等的数字组成一个整数k0(不一定是四位数),然后从k0开始不断地作K变换,得出数k1,k2,k3,...,则必有某个m(m=<7),使得km=6174.
更一般地,从0,1,2,...,9中任取n个不全相同的数字组成一个十进制数k0(不一定是n位数),然后,从k0开始不断地做K变换,得出k1,k2,...,那么结果会是怎样的呢?现在已经知道的是:
n=2,只能形成一个循环:(27,45,09,81,63).例如取两个数字7与3,连续不断地做K变换,得出:36,27,45,09,81,27,...出现循环.
n=3,只能形成一个循环:(495).
n=4,只能形成一个循环:(6174).
n=5,已经发现三个循环:(53855,59994),(62964,71973,83952,74943),(63954,61974,82962,75933).
n=6,已经发现三个循环:(642654,...),(631764,...),(549945,...).
n=7,已经发现一个循环:(8719722,...).
n=8,已经发现四个循环:(63317664),(97508421),(83208762,...),(86308632,...)
n=9,已经发现三个循环:(864197532),(975296421,...),(965296431,...)
容易证明,对于任何自然数n>=2,连续做K变换必定要形成循环.这是因为由n个数字组成的数只有有限个的缘故.但是对于n>=5,循环的个数以及循环的长度(指每个循环中所包含数的个数)尚不清楚,这也是国内一些数学爱好者热衷于研究的一个课题.
输入一个n位数,把所有数字从大到小排序得到a,从小到大得到b,然后用a-b替换原来这个数
并且继续操作。1234 、4321-1234=3087、8730-378=8352、8532-2358=6174
样例输入:1234
样例输出:1234->3087->8352->6074->6174
#include<stdio.h>
#include<stdlib.h>
#include<string>
//对象函数
int cmp(const void *_a, const void *_b)
{
char *a = (char *)_a;
char *b = (char *)_b;
return *a - *b;
}
int getNext(int x)
{
int a;
int b;
int n;
char s[100] = {0};
//数字转字符
sprintf(s,"%d",x);
//字符数组排列
qsort(s,strlen(s),sizeof(s[0]),cmp);
//字符数组转数字
sscanf(s,"%d",&a);
//翻转字符,strrev不是ANSI函数(标准C库函数)
strrev(s);
sscanf(s,"%d",&b);
return b - a;
}
int num[2000];
int count;
int main(void)
{
scanf("%d",&num[0]);
printf("%d",num[0]);
count = 1;
while(1)
{
num[count] = getNext(num[count-1]);
printf("->%d",num[count]);
int found = 0;
for(int i = 0; i < count; ++i)
{
if(num[i] == num[count])
{
found = 1;
break;
}
}
if(found)
break;
count++;
}
printf("\n");
return 0;
}