import java.util.Stack;
/**
* 功能描述:任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,
* 一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,则前边
* 补0)。如此往复,数字会落入某个循环圈(称为数字黑洞)。比如,刚才的数字会落入:[82962, 75933,
* 63954, 61974] 这个循环圈。请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。其中
* 5位数全都相同则循环圈为 [0],这个可以不考虑。循环圈的输出格式仿照:[82962, 75933, 63954, 61974]
* 其中数字的先后顺序可以不考虑。此程序兼容任何整数
* @author Administrator
*
*/
public class NumBlackHole {
private int baseNum;
private int size;
private Stack<String> hole;
private Stack<String> relHole;
/**
* @param 程序入口处
*/
public static void main(String[] args) {
if(args.length<1){System.out.println("请输入要找出数字黑洞的数字");System.exit(0);}
int number=0;
try {
number=Integer.parseInt(args[0]);
} catch (NumberFormatException e) {
System.out.println("请输入正确的整数!");
System.exit(0);
e.printStackTrace();
}
NumBlackHole num=new NumBlackHole(number);
num.Com();
}
/**
* 构造方法
* @param baseNum
*/
public NumBlackHole(int baseNum) {
this.baseNum = baseNum;
this.size=(this.baseNum+"").length();
hole= new Stack<String>();relHole=new Stack<String>();
}
/**
* 开始计算
*/
public void Com(){
String base=baseNum+"";
deal(base,1);
deal(hole.peek(),2);
System.out.print("[");
int length=relHole.size();
for(int i=0;i<length;i++){
System.out.print(relHole.pop());
if(i<length-1)System.out.print(" ");
}
System.out.println("]");
}
/**
* 处理数字校正后的字符串
* @param s
* @param flag
*/
private void deal(String s,int flag){
switch (flag) {
case 1:
if(hole.contains(s))return;
hole.push(s);
break;
case 2:
if(relHole.contains(s))return;
relHole.push(s);
break;
default:
break;
}
int value=Compare(s);
String s1=check(value);
deal(s1,flag);
}
/**
* 校正数字的位数
* @param value
* @return
*/
private String check(int value) {
String tp=value+"";
int a=tp.length();
for(int i=0;i<this.size-tp.length();i++){
tp="0"+tp;
}
return tp;
}
/**
* 重新排列,求差值
* @param s
* @return
*/
private int Compare(String s){
int max=NumberTool.getNumber(s,1);
int min=NumberTool.getNumber(s,-1);
return max-min;
}
}
class NumberTool{
/**
* 获得该字符串各个字符组成的整数
* @param num_str
* @param flag -1 最小整数 1最大整数 默认最大整数
* @return
*/
public static int getNumber(String num_str,int flag){
if(!checkStr(num_str)){
NumberFormatException exc=new NumberFormatException();
throw exc;
}else{
int tmp[]=new int[num_str.length()];
for(int i=0;i<num_str.length();i++){
tmp[i]=Integer.parseInt(num_str.charAt(i)+"");
}
for(int i=0;i<tmp.length;i++){
for(int j=tmp.length-1;j>i;j--){
switch (flag) {
case 1:
if(tmp[i]>tmp[j]){
int tp=tmp[i];
tmp[i]=tmp[j];
tmp[j]=tp;
}
break;
case -1:
if(tmp[i]<tmp[j]){
int tp=tmp[i];
tmp[i]=tmp[j];
tmp[j]=tp;
}
break;
default:
if(tmp[i]>tmp[j]){
int tp=tmp[i];
tmp[i]=tmp[j];
tmp[j]=tp;
};
}
}
}
int rtn=0;
for(int i=0;i<tmp.length;i++){
rtn+=tmp[i]*Math.pow(10,i);
}
return rtn;
}
}
/**
* 检查字符串中是否有非数字的字符
* @param s
* @return
*/
private static boolean checkStr(String s){
try {
Integer.parseInt(s);
return true;
} catch (NumberFormatException e) {
System.out.println("字符串中含有非法字符");
return false;
}
}
}
分享到:
相关推荐
西西弗斯黑洞【123数字黑洞】 /// 设定一个任意数字串,数出这个数中的偶数个数,奇数个数,及这个数中所包含的所有位数的总数 /// 比如86420135799,按照偶数个数5,奇数个数6,数字总个数11,拼接成一个新的...
它首先生成一个随机的四位数,然后通过重复执行特定的操作(即重组数字并求差值),直至收敛到一个固定的数字。这一过程不仅展示了黑洞数字的奇妙之处,同时也提供了关于C++编程语言中数组、循环以及函数调用等基础...
【标题】:“蓝桥杯国赛题之C++数字黑洞” 【内容】 “蓝桥杯”是一项全国性的专业编程竞赛,旨在提升大学生的计算机技术应用能力,尤其是编程和算法设计能力。在这样的比赛中,参赛者需要用C++等编程语言解决各种...
【数字黑洞1】是一种有趣的数学现象,也与算法设计紧密相关。这个概念源自于一个特定的数字游戏,其中任何四位数(前提条件是这四位数字不完全相同)通过一系列操作最终都会达到一个固定点,即数字6174。这个数字被...
数字黑洞,指的是某种运算,这种运算一般限定从某些整数出发,反复迭代后结果必然落入一个点或若干点。任意整数a,如果它的偶数位的个数为b,奇数位的个数为c,b和c的和为d,那么定义运算@:@a = bcd,比如 @647382 ...
5--[数字黑洞1和4].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码5--[数字黑洞1和4].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码5--[数字黑洞1和4].zip源码scratch2.0 3.0编程项目源文件源码...
在这个"易语言源码易语言数字黑洞源码.rar"压缩包中,包含的是用易语言编写的关于数字黑洞的程序源代码。数字黑洞,也称为信息黑洞,是一个有趣的数学概念,它指的是一个数列经过特定的运算规则后,最终会陷入一个或...
mathematica演示数字黑洞,123黑洞、6174、水仙花数、角谷猜想 func[x_] := If[OddQ[x], 3*x + 1, x/2] NestWhileList[func, 27, # != 1 &] ListLinePlot[%, PlotRange -> All]
易语言数字黑洞源码是指使用易语言编写的程序,该程序可能用于演示或计算数字黑洞。数字黑洞,又称为“数字怪兽”,是指一个数字序列,当你对它进行特定的运算(通常是连续取模和除法)后,不论初始数字是什么,最终...
数字黑洞.cpp
### 数字黑洞概念 在数学领域中,“数字黑洞”是一个有趣的概念,指的是通过特定操作将一个数字转换到一个不变的值或循环中的现象。对于题目中的“数字黑洞”问题,其核心思想是针对一个五位数,将其数字进行重新...
Java中数字黑洞实现代码 Java中数字黑洞实现代码主要介绍了Java编程中如何实现数字黑洞算法游戏,其中涉及到了数组、scanner、if语句等Java编程的基础知识。数字黑洞算法游戏是指从一个四位正整数开始,通过不断地...
任何一个各位数字不全相同的三位数,经有限次“重排求差”操作,总会得到495。最后所得的495即为三位黑洞数。所谓“重排求差”操作即组成该数的数字重排后的最大数减去重排后的最小数。(6174为四位黑洞数。) 例如...
这里的“重排求差”操作指的是将一个三位数的三个数字重新排列,形成最大的数和最小的数,然后计算它们的差值。例如,对于数字107,重排求差序列是710-17=693,963-369=594,954-459=495。 为了编程验证这个规律,...
5--[123数字黑洞].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码5--[123数字黑洞].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码5--[123数字黑洞].zip源码scratch2.0 3.0编程项目源文件源码案例...
数字黑洞123.sb3
本项目“Scratch少儿编程项目源代码文件案例蓝桥训练-数字黑洞.zip”提供了一个有趣的编程学习案例,通过“数字黑洞”这个游戏,孩子们可以深入理解编程的基本概念。 "数字黑洞"游戏是一种数学上的趣题,也被称为...
数字黑洞: · 数字黑洞是指一些数字经过某些运算后而进入死循环。 随机选择4个数字(不可相同)按照从大到小排成一个数字,再用这个数字减去从小到大排成的数字,再把结果包括的数字按照以上步骤继续。最后7步必得...
List数字黑洞6174.py