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";
}
}
}
}
得到的結果截圖如下:
相關文章
- 1019 數字黑洞 (20 分)javaJava
- PAT1019 數字黑洞(java實現)Java
- Java技巧-解決JAVA_HOME變數無效問題Java變數
- JAVA | Java 解決跨域問題Java跨域
- 數字化轉型解決企業資料安全問題
- Java郵件(問題解決)Java
- Java解決跨域問題Java跨域
- 解決程式(因為數字的問題)沒反應的方法
- Java.nio-隨機讀寫解決漢字亂碼問題Java隨機
- 解決「問題」,不要解決問題
- Java 解決中文亂碼問題Java
- JAVA程式設計題-用java解決兔子問題Java程式設計
- 演算法筆記_217:黑洞數(Java)演算法筆記Java
- Java中關於十進位制數取反問題解決Java
- 題解1787:小O的數字 (Java描述)Java
- 阿里研究院:穿越數字黑洞(附下載)阿里
- nginx 直播程式數問題(待解決)Nginx
- 解決超過會話數問題會話
- java中亂碼問題解決方法Java
- java nio解決半包 粘包問題Java
- nginx /Java 解決跨域問題方案NginxJava跨域
- 智慧數字經營的出現能夠解決哪些實際問題?
- jive 漢字問題終極解決辦法
- 數字化轉型該如何做?四大問題必須解決
- 【求教:如何解決 java 浮點數精度問題】Java
- Java™ 教程(常見問題及其解決方案)Java
- java學習中問題與解決方式Java
- java中解決request中文亂碼問題Java
- 解決問題
- 字串轉數字的問題字串
- JavaScript解決浮點數算數運算精度問題JavaScript
- 發現問題,解決問題
- 使用 SVG transform rotate 解決畫框中的數字跟隨旋轉的問題SVGORM
- C語言基礎例項—3句解決數字出現頻率問題C語言
- 數字經濟時代,智慧經營是如何助力企業解決經營問題?
- js算數運算精度問題解決方案JS
- multidex解決65k方法數問題IDE
- rake 任務引數傳遞問題解決