数学黑洞问题

“数学黑洞”:任意一个4位自然数,将组成该数的各位数字重新排列,形成一个最大数和一个最小数,之后两数相减,其差仍为一个自然数。重复进行上述运算,最终会出现一个神秘的数,请编程输出这个神秘的数。


#include <stdio.h>

#define INIT 1234

#define SWAP(arr,i,j)\
{arr[i]^=arr[j];arr[j]^=arr[i];arr[i]^=arr[j];}

#define PUSHMIN(arr, i, j)\
	if(arr[i]>arr[j])SWAP(arr,i,j);

#define SORTARR4(arr)\
{\
	PUSHMIN(arr,0,1);\
	PUSHMIN(arr,0,2);\
	PUSHMIN(arr,0,3);\
	PUSHMIN(arr,1,2);\
	PUSHMIN(arr,1,3);\
	PUSHMIN(arr,2,3);\
}

#define I2A(num,arr)\
{\
	arr[0]=(num)/1000%10;\
	arr[1]=(num)/100%10;\
	arr[2]=(num)/10%10;\
	arr[3]=(num)%10;\
}

#define A2II(arr,num)\
	num=arr[0]*1000+arr[1]*100+arr[2]*10+arr[3];
#define A2ID(arr,num)\
	num=arr[3]*1000+arr[2]*100+arr[1]*10+arr[0];


int main(int argc, const char *argv[])
{
	unsigned int cur = 1234, prev = 0;
	unsigned int max, min;
	unsigned char arr[4];
	while (1)
	{
		prev = cur;
		I2A(cur,arr);
		SORTARR4(arr);
		A2ID(arr,max);
		A2II(arr,min);
		cur = max - min;
		if (prev == cur)
		{
			printf("%d\n", cur);
			break;
		}
	}
	return 0;
}


最后求出这个黑洞数是6174

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值