黑洞数

发布时间 2023-04-13 21:20:36作者: xXinG9199

黑洞数也称为陷阱数,又称“Kaprekar问题”,是一类具有奇特转换特性的数。

任何一个各位数字不全相同的三位数,经有限次“重排求差”操作,总会得到495。最后所得的495即为三位黑洞数。所谓“重排求差”操作即组成该数的数字重排后的最大数减去重排后的最小数。(6174为四位黑洞数。)

例如,对三位数207:

第1次重排求差得:720 - 27 = 693;
第2次重排求差得:963 - 369 = 594;
第3次重排求差得:954 - 459 = 495;
以后会停留在495这一黑洞数。如果三位数的3个数字全相同,一次转换后即为0。

任意输入一个三位数,编程给出重排求差的过程。

#include<stdio.h>

void swap(int* a, int* b) {
	int temp = *b;
	*b = *a;
	*a = temp;
}

void sw_max(int* a, int* b, int* c) {
	if (*a < *b) swap(a, b);
	if (*b < *c) swap(b, c);
	if (*a < *b) swap(a, b);
}

void sw_min(int* a, int* b, int* c) {
	if (*a > *b) swap(a, b);
	if (*b > *c) swap(b, c);
	if (*a > *b) swap(a, b);
}

//合
int h(int* a, int* b, int* c) {
	return (*a * 100) + (*b * 10) + (*c * 1);
}

//拆
void sp(int* a, int* b, int* c, int* n) {
	*a = *n / 1 % 10; //个
	*b = *n / 10 % 10; //十
	*c = *n / 100 % 10; //百
}

int main() {
	int n, a, b, c;
	scanf("%d", &n);

	//排序方法(可以先拆分个十百,然后排序就可以),后面就遍历即可。

	sp(&a, &b, &c, &n);

	
	for (int count = 1; ; count++)
	{
		sw_max(&a, &b, &c);
		int max = h(&a, &b, &c);

		sw_min(&a, &b, &c);
		int min = h(&a, &b, &c);

		printf("%d: %d - %d = %d\n", count, max, min, max - min);

		n = max - min; // 把新的差丢回来
		sp(&a, &b, &c, &n);

		if ((max - min) == 495) break;
	}
	return 0;
}