java解決數字黑洞問題

彴兗發表於2020-11-14

數字黑洞問題

什麼是數字黑洞:

​ 假設有一個任意的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";
			}

		}

	}

}

得到的結果截圖如下:

在這裡插入圖片描述

相關文章