数字黑洞简介:
黑洞数又称陷阱数,是类具有奇特转换特性的整数。任何一个数字不全相同整数,经有限“重排求差”操作,总会得某一个或一些数,这些数即为黑洞数。“重排求差”操作即把组成该数的数字重排后得到的最大数减去重排后得到的最小数。—《互动百科》
下面看《算法笔记》上一个关于给定四位不完全相同的数字,演示到达:“数字黑洞的过程”。
题目描述:
给定一个各位数字完全不相同的四位正整数,如果先把四个数字按照非递排序(递增),再按照非递减排序(递增),然后用第一个数字减去第二个数字将得到一个重复的数字。一直重复怎样做,很快会停在有数字黑洞之称的6174,这个神奇的数字也叫Kaprekar常数。
例如:从6767开始,将会得到
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1268 = 8352
8543 - 2358 = 6174
7641 - 1467 = 6174
…
现在给定任意四位正整数,请编写程序演示到达数字黑洞的过程
输入格式:输入给出一个(0,10000)区间的正整数N。
输出格式:如果N的四位数全相等,则在一行内输出”N - N = 0000”。否则将计算的每一步在一行内输出,直到6174作为差出现,输出格式见样例。注意,每个数字按四位数格式输出。
输入样例1:6767
输出样例1:
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1268 = 8352
8543 - 2358 = 6174
输入样例2:2222
输出样例2:2222 - 2222 = 0
#include <stdio.h>
#include <algorithm>
using namespace std;
//自定义排序规则,sort函数按照递增排序
bool cmp(int a,int b){
return a>b;
}
//因为要获取当前数字按照每位排序的最大值和最小值
//将数字转换为数组方便排序
void numToAarry(int num,int nums[]){
for(int i=0;i<4;++i){
nums[i] = num%10;//获取当前数字的个位
num /= 10;
}
}
//排序完成后,将数组中已排好序的数字转换为数字
int arrayToNum(int num,int nums[]){
int num = 0;
for(int i=0;i<4;++i){
num = num*10+nums[i];
}
return num;
}
int main(){
int MAX;
int MIN;
int n;
scanf("%d",&n);
while(1){
int nums[4];
numToAarry(n,nums);
sort(arr,arr+4);//从小到达排序
MIN = arrayToNum(nums);
sort(arr,arr+4,cmp);//从大到小排序
MAX = arrayToNum(nums);
n = MAX-MIN;
//%4d小数点前不足四位时用0补齐
printf("%04d - %04d = %d",MAX,MIN,n);
if(n==0 || n==6174)
break;
}
}
参考:《算法笔记》