admin 2026-08-13 12:39:33 世界杯专用足球

数字黑洞

数字黑洞简介:

黑洞数又称陷阱数,是类具有奇特转换特性的整数。任何一个数字不全相同整数,经有限“重排求差”操作,总会得某一个或一些数,这些数即为黑洞数。“重排求差”操作即把组成该数的数字重排后得到的最大数减去重排后得到的最小数。—《互动百科》

下面看《算法笔记》上一个关于给定四位不完全相同的数字,演示到达:“数字黑洞的过程”。

题目描述:

给定一个各位数字完全不相同的四位正整数,如果先把四个数字按照非递排序(递增),再按照非递减排序(递增),然后用第一个数字减去第二个数字将得到一个重复的数字。一直重复怎样做,很快会停在有数字黑洞之称的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

代码语言:javascript复制#include

#include

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;

}

}参考:《算法笔记》