蓝桥杯 黑洞数 解题报告

article/2025/9/9 15:00:39



任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,则前边补0)。如此往复,数字会落入某个循环圈(称为数字黑洞)。
比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。


请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。其中5位数全都相同则循环圈为 [0],这个可以不考虑。


循环圈的输出格式仿照:
[82962, 75933, 63954, 61974]


其中数字的先后顺序可以不考虑。


本以为会是比较容易能做出来的,但是由于没有考虑所有的情况,加上过年这几天吃昏头了,做了3个多小时敲打,好在总算是出来了。


对于黑洞数的定义,题目很清晰,要获得数列中的下一个数,就必须对给定的数的每一位重新排序求得最大和最小,而且还有可能出现位数不足五位的情况,所以,在拆数的时候,我固定就拆5次,这样,不足的位数就可以被0补上,从而满足题目的要求。,查找循环圈也比较容易,麻烦就麻烦在重复的循环圈如何判别,这里我是用这样的方法:对于每一个数,都有一个判别标志位visited[],每一次读入一个数,就把这个标志置1,这样,当我们得到一个含有循环圈的数列之后,每一个数在大循环中都不可能出现,但还存在一种情况,就是通过一个从未被访问的数,却进入之前进入过的一个循环圈,解决的方法是:在读数的时候把每含有循环圈的数列的每一个数的标志位再加1,也就是2,这样既不会影响上面循环中重复位的判断,也可以避免通过不同的数进入同一个循环圈,因为当检测到某一个数的标志位为2时,不仅停止循环,而且通过flag标志阻止下面进行输出,这样就可以顺利求出所有的循环圈,也就是黑洞数。

#include<iostream>
#include<cmath>
#include<algorithm>
#include<memory.h>
#define N 90000
using namespace std;
int num[N];
int visited[100000];
int s[N];
bool cmp(int a,int b)
{return a>b;
}void init()
{int i;int n=10000;for(i=0;i<N;i++)num[i]=n++;memset(visited,0,sizeof(visited));
}int find(int t,int j)
{for(int i=0;i<j;i++)if(s[i]==t)return 0;return 1;
}int getMax(int n)
{int i;int T=0;int temp[5];for(i=4;i>=0;i--){temp[i]=n%10;n=n/10;}sort(temp,temp+5);for(i=0;i<5;i++){T=T+temp[i]*pow(10,i);}return T;
}
int getMin(int n)
{int i;int T=0;int temp[5];for(i=4;i>=0;i--){temp[i]=n%10;n=n/10;}sort(temp,temp+5,cmp);for(i=0;i<5;i++){T=T+temp[i]*pow(10,i);}return T;
}int main()
{int t,i,j,k,flag;init();for(i=10000;i<=99999;i++){if(visited[i])continue;//cout<<"i="<<i<<":"<<endl;memset(s,-1,sizeof(s));s[0]=i;j=1;flag=0;visited[i]=1;t=getMax(i)-getMin(i);while(1){if(t==0)break;//cout<<t<<endl;//getchar();//cout<<getMax(*it)<<' '<<getMin(*it)<<endl;//cout<<t<<endl;//cout<<find(t,j)<<endl;if(visited[t]>1){flag=1;break;}if(find(t,j)==1){s[j]=t;j++;visited[t]=1;}else break;t=getMax(t)-getMin(t);}if(flag==0&&t!=0){for(k=0;k<j;k++){visited[s[k]]++;if(s[k]==t)break;} for(;k<j;k++){visited[s[k]]++;cout<<s[k]<<' ';//getchar();}cout<<endl;}}return 0;
}







http://chatgpt.dhexx.cn/article/AEAZgK3M.shtml

相关文章

黑洞数—python

黑洞数:黑洞数又称陷阱数,是类具有奇特转换特性的整数。任何一个数字不全相同整数,经有限“重排求差”操作,总会得某一个或一些数,这些数即为黑洞数。“重排求差”操作即把组成该数的数字重排后得到的最大数减去重排后得到的最小数。或者是冰雹原理中的“1”黑洞数 如果有…

6174 黑洞数字

关于6174这个数字的猜想是&#xff1a;从0到9取任意4个不全相同的数字&#xff0c;从大到小排列得到一个4位大数&#xff0c;从小到大排列得到一个4位小数&#xff0c;二者大减小做差&#xff0c;得到一个新的差值&#xff0c;这个值不足4位数补0&#xff0c;重复排列做差的操作…

求4位数的黑洞数

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

C语言验证黑洞数6174

0x00 问题描述 问题简述&#xff1a;任意选一个四位数(数字不能全相同)&#xff0c;把所有数字从大到小排列&#xff0c;再把所有数字从小到大排列&#xff0c;用前者减去后者得到一个新的数。重复对新得到的数进行上述操作&#xff0c;7步以内必然会得到6174。 0x01 代码设计…

黑洞数 C语言

黑洞数也称为陷阱数&#xff0c;又称“Kaprekar问题”&#xff0c;是一类具有奇特转换特性的数。 任何一个各位数字不全相同的三位数&#xff0c;经有限次“重排求差”操作&#xff0c;总会得到495。 最后所得的495即为三位黑洞数。所谓“重排求差”操作即组成该数的数字重排…

黑洞数

黑洞数是指于四位数中&#xff0c;只要数字不完全相同&#xff0c;将数字由大到小的排列减去由小到大的排列。假设一开始选定的数字为&#xff0c;f()&#xff0c;f()&#xff0c;...&#xff0c;f() 用同样的规则继续算下去&#xff0c;最后的结果一定是6174。 比如说一开始选…

python求黑洞数_求解黑洞数

问题描写&#xff1a; 黑洞数又称圈套数&#xff0c;是类具有奇特转换特性的整数。任何1个数字不全相同的整数&#xff0c; 经有限“重排求差”操作&#xff0c;总会得到某1个或1些数&#xff0c;这些数即为黑洞数。 “重排求差”操作即把组成该数的数字重排后得到的最大数减去…

负载均衡之加权轮询算法

在介绍加权轮询算法(WeightedRound-Robin)之前&#xff0c;首先介绍一下轮询算法(Round-Robin)。 一&#xff1a;轮询算法(Round-Robin) 轮询算法是最简单的一种负载均衡算法。它的原理是把来自用户的请求轮流分配给内部的服务器&#xff1a;从服务器1开始&#xff0c;直到服务…

基于HTTP的长轮询实现

Web客户端与服务器之间基于Ajax&#xff08;http&#xff09;的常用通信方式&#xff0c;分为短连接与长轮询。 短连接&#xff1a;客户端和服务器每进行一次HTTP操作&#xff0c;就建立一次连接&#xff0c;任务结束就中断连接。 在长轮询机制中&#xff0c;客户端像传统轮询一…

Linux轮询操作

Linux设备之非阻塞I/O操作 文章目录 Linux设备之非阻塞I/O操作前言一、接口简介1、select2、poll3、epoll4、总结 二、接口介绍三、代码样例 前言 上一篇讲解了Linux设备的阻塞I/O操作&#xff0c;其原理是利用了把进程挂到等待队列中&#xff0c;等条件满足时再唤醒此进程。本…

短轮询和长轮询

轮询是由客户端每隔一段时间向服务器发出HTTP请求&#xff0c;服务端接收到请求后向客户端返回最新的数据。 客户端的轮询方式一般分为短轮询和长轮询。 短轮询&#xff1a; 一般是由客户端每隔一段时间向服务器发起一次普通HTTP请求。服务端查询当前接口是否有数据更新&#x…

轮询与长轮询

轮询&#xff1a;说白了就是客户端定时去请求服务端&#xff0c; 是客户端主动请求来促使数据更新&#xff1b; 长轮询&#xff1a;说白了 也是客户端请求服务端&#xff0c;但是服务端并不是即时返回&#xff0c;而是当有内容更新的时候才返回内容给客户端&#xff0c;从流程…

前端实现轮询

方法一&#xff1a;简单实现 componentDidMount() {this.props.countFxMissionByStatus();countSwiftMessage(); }componentWillReceiveProps(nextProps) {const {location} nextProps;// 判断页面然后在更新的周期中实现轮询const isSwiftManage location.pathname.indexOf…

NGINX轮询机制的几种形式

前言&#xff1a;总以为轮询就简单的next而已&#xff0c;实际还有几种不同的实现机制。某个客户的源站有几个不同的IP&#xff0c;回源的时候自然是采用的轮询的机制。客户业务上线前&#xff0c;检查源站的联通性发现一个漏网之鱼竟然差点滥竽充数。然而客户的想法确是&#…

事件轮询机制理解

进程与线程 首先简单了解下进程和线程的概念 进程&#xff1a;cpu资源分配的最小的单位&#xff0c;是拥有资源和独立运行的最小单位&#xff0c;程序执行时&#xff0c;会创建一个进程&#xff0c;cpu为其分配资源&#xff0c;并加入进程就绪队列。线程&#xff1a;cpu调度的…

事件轮询机制

事件循环(轮询)机制 js是单线程的所有js代码都是在主线程执行的同步任务进入主线程即会执行异步任务则会进入浏览器的管理模块 (有DOM事件管理模块、ajax请求管理模块、定时器管理模块等)管理模块一直监视异步任务是否满足条件。如果满足条件则会将对应的回调放入回调队列中(c…

IP多播(组播)

一 IP多播的基本概念 IP多播(multicast&#xff0c;也被译为组播)&#xff0c;它是一种一对多的通信方式。与单播相比&#xff0c;多播可以大大节约网络资源。 以视频流媒体服务为例说明单播和多播的区别&#xff0c;如图所示&#xff1a; 图1 单播与多播的比较 (a) 中使用的…

多播

19.1 概述 单播地址标识单个接口&#xff0c;广播地址标识子网上的所有接口&#xff0c;多播地址标识一组接口。单播和广播是编制方案的两个极端(要么一个要么全部)&#xff0c;多播的目的就在于提供一种折衷方案。多播数据报仅由对该数据报感兴趣的接口接收&#xff0c;也就是…

单播 、多播(组播)、广播

作者&#xff1a;yhthu 链接&#xff1a;https://www.jianshu.com/p/cc62e070a6d2#comments 来源&#xff1a;简书 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 目录 单播、多播(组播)、广播、任播单播组播广播任播 单播、多播(组播)、广…

UDP之多播/组播

目录 一.什么是多播(组播)&#xff1f;为什么出现多播(组播)&#xff1f;二.组播地址三.主机网卡对应的编号 ifconfig命令ip ad (ip adress)获取网卡对应的编号四.多播实现 一.什么是多播(组播)&#xff1f;为什么出现多播(组播)&#xff1f; 由上节课讲到的广播&#xff0c;可…