数字黑洞java,java解决数字黑洞问题

数字黑洞问题

什么是数字黑洞:

? 假设有一个任意的5位数,如34256,把他的各位数字打乱,重新排列,就可以得到一个最大的数字65432,还有一个最小的数23456。求这两个数字的差,得到41976,然后把这个数字再次重复上述过程(如果不足5位则前面补0)。如此往复数字会落入某个循环圈(称为数字黑洞)。比如,刚才的数字会落入:

? MAX MIN RESULT

? 65432 23456 41976

? 97641 14679 82962

? 98622 22689 75933

? 97533 33579 63954

? …

? …

? 97641 14679 82962

? 98622 22689 75933

? 97533 33579 63954

? 96543 34569 61974

? 97641 14679 82962

? 98622 22689 75933

? 97533 33579 63954

? 96543 34569 61974

? 最终进入**[82962,75933,63954,61974]**这个循环圈。

? 像这种一个自然数经过某种数学运算后陷入了一种循环的境况就称之为数学黑洞。

那如何用java解决这个问题呢

? 首先我们可以将 输入的5位整数转为String类型的字符串,然后通过charAt()将字符串的每一位存在一个int数组中,用Arrays.sort将数组排序和遍历,得到一个从小到大排序的数组和一个从大到小排序的数组,,然后用遍历将数组中的数据取出来,得到一个最大数MAX和一个最小数MIN,然后将他们相减,得到一个新的数。如果结果在1000-10000之间就是四位数我们需要在后面加一个0,如果结果是100-1000 之间的三位数我们组需要在末尾加两个0,如果结果在10-100 之间那么就是一个两位数,我们需要加三个0,否则我们需要在末尾加四个0。然后不停地循环这个过程,就会陷入一个循环,就可以得到这个数字黑洞的结果。

具体实现代码如下:

package blackloop;

import java.util.Arrays;

public class Black {

public static void main(String[] args) {

// 获得五位数转为string类型

int a = 34256;

String temp = Integer.toString(a);

// 将循环相减后的结果存入数组中

int judg = 0;

int[] judg1 = new int[5];

for (int i = 0; i < 5; i++) {

judg1[i] = i;

}

// 循环遍历

while (true) {

// 将string数字放入数组(无序)

int[] buf = new int[5];

for (int i = 0; i < buf.length; i++) {

buf[i] = Integer.parseInt(temp.substring(i, i + 1));

}

// 将得到的数组排序后正序和倒序得到最大数和最小数(String类型)

Arrays.sort(buf);

String min = "";

String max = "";

int count = 0;

for (int i = buf.length - 1; i >= 0; i--) {

max += Integer.toString(buf[i]);

min += Integer.toString(buf[count]);

count++;

}

// 得到最大数和最小数之间的差(将String转为int后进行相减)

int result = Integer.parseInt(max) - Integer.parseInt(min);

// 选择存入结果到数组中,

switch (judg) {

case 0:

judg1[judg] = result;

judg++;

break;

case 1:

judg1[judg] = result;

judg++;

break;

case 2:

judg1[judg] = result;

judg++;

break;

case 3:

judg1[judg] = result;

judg++;

break;

case 4:

judg1[judg] = result;

judg = 0;

break;

}

// 输出每次的最大值和最小值,还有相减的差

System.out.println(max + " " + min + " " + result);

// 判断,如果存入数组的数据每隔3个开始相等则退出循环,得到结果

if (judg1[0] == judg1[4] || judg1[1] == judg1[0] || judg1[2] == judg1[1] || judg1[3] == judg1[2]

|| judg1[4] == judg1[3]) {

return;

}

/**

* 判断得到的差的大小, 如果在1000-10000之间就是四位数加一个0 在100-1000 之间就是三位数加00 在10-100之间就是两位数 加000

* 否则加0000

*/

if (result > 99999) {

temp = Integer.toString(result);

} else if (result < 10000 && result >= 1000) {

temp = Integer.toString(result) + "0";

} else if (result < 1000 && result >= 100) {

temp = Integer.toString(result) + "00";

} else if (result < 100 && result >= 10) {

temp = Integer.toString(result) + "000";

} else {

temp = Integer.toString(result) + "0000";

}

}

}

}

得到的结果截图如下:

202011140742219335.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值