首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >数字黑洞

数字黑洞

作者头像
lexingsen
发布2022-02-24 18:46:18
发布2022-02-24 18:46:18
8800
举报
文章被收录于专栏:乐行僧的博客乐行僧的博客

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

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

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

参考:《算法笔记》

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档