黑洞数也称为陷阱数,又称“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;
}
标签:min,int,max,求差,黑洞,swap,重排
From: https://www.cnblogs.com/xxing/p/17316439.html