6174的问题

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,...) 

   容易证明,对于任何自然数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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值