数字黑洞问题
什么是数字黑洞:
假设有一个任意的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 <