国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

5位數字黑洞

2019-11-06 06:52:08
字體:
來源:轉載
供稿:網友

1007.5位數字黑洞

Description

任意一個5位數,比如:34256,把它的各位數字打亂,重新排列,可以得到一個最大的數:65432,一個最小的數23456。求這兩個數字的差,得:41976,把這個數字再次重復上述過程(如果不足5位,則前邊補0)。如此往復,數字會落入某個循環圈(稱為數字黑洞)。比如,剛才的數字會落入:[82962, 75933, 63954, 61974] 這個循環圈。請編寫程序,找到5位數所有可能的循環圈,并輸出,每個循環圈占1行。其中5位數全都相同則循環圈為 [0],這個可以不考慮。循環圈的輸出格式仿照:[82962, 75933, 63954, 61974]其中數字的先后順序可以不考慮。

Input

Output

[74943, 62964, 71973, 83952][63954, 61974, 82962, 75933][53955, 59994][0]模擬上述過程即可,注意優化
import java.util.Arrays;public class T71 {		static int[] data=new int[10000*10+1];			public static void main(String[] args) {		for (int i = 10000; i <= 100000; i++) {						if (convert(i) == 0) { //對于 XXXXX這樣的數(例如33333),不用處理。				data[i] = 1;    //標記出現過num				continue;			}			if (data[i] == 1){  //已出現過的數不再處理。				continue;			}			getQuan(i);		}	}	PRivate static void getQuan(int k) {		int[] arr=new int[1000];		arr[0]=k;				//主要的不同點:將每次做差得到的數依次放進數組中,然后輸出圈的時候比較方便		//老師的將得到的數做數組下標,放進圈中,然后打印圈什么的有點復雜		while(data[k]!=1){						data[k]=1;			int m=convert(k);			k=m;			for (int i = 1; i < arr.length; i++) {				if(arr[i]==0){//圈中沒有的數,放進圈中					arr[i]=m;					break;				}else{					if(arr[i]==m){//找到了圈,打印						System.out.print("[");						for (int j = i; j < arr.length; j++) {							if(arr[j]==0){								System.out.println("]");								return;							}							System.out.print(arr[j]);							if(arr[j+1]!=0)								System.out.print(",");						}					}				}			}		}	}	private static int convert(int n) {		int[] arr = new int[5];		for (int i = 0; i < 5; i++) {			arr[i] = n % 10;			n /= 10;		}		Arrays.sort(arr);		int max = 0;		int min = 0;		int tenN = 1;		for (int i = 0; i < 5; i++) {			min = 10 * min + arr[i];			max += tenN * arr[i];			tenN *= 10;		}				return max - min;	}}老師寫的方法:
import java.util.Arrays;import java.util.LinkedList;import java.util.Queue;public class T7 {static int[] visited = new int[100000]; // 放所有出現過的數static int[] now = new int[100000];  	//存放當前數變換出的所有結果//雙擊查看原圖到并打印第一次出現的圈private static void printCircle(int num) {	int k = num;		while (visited[k] != 1  && now[k] != 1 )  //如果沒有遇到圈(原來沒有出現,且本輪也沒有出現),則繼續變換	{now[k] = num;	 //(1)標記本輪(num起點)出現過n	visited[k] = 1; 	 //(2)標記出現過n	k = convert(k);	 //(3)繼續變換	}  	if(now[k]==num){	//本輪新出現的圈		Queue<Integer>  queue = new LinkedList<Integer>(); //放環中的元素	queue.add(k);	 //k入隊	k = convert(k);	while (k != queue.peek()) {	queue.add(k);  	k = convert(k); }System.out.print( "[");while( queue.size()>1) {System.out.print( queue.poll() + ",");}System.out.println(queue.poll()+"]");}}/**  * @param n * @return 返回n變換后的值。 * 即各位數字打亂,重新排列,得到的最大數-最小數 */private static int convert(int n) {int[] arr = new int[5];for (int i = 0; i < 5; i++) {arr[i] = n % 10;n /= 10;}Arrays.sort(arr);int max = 0;int min = 0;int tenN = 1;for (int i = 0; i < 5; i++) {min = 10 * min + arr[i];max += tenN * arr[i];tenN *= 10;}	return max - min;}public static void main(String[] args) {for (int num = 10000; num < 100000; num++) {	//窮舉五位數	if (convert(num) == 0) { //對于 XXXXX這樣的數(例如33333),不用處理。visited[num] = 1;    //標記出現過numcontinue;}if (visited[num] == 1)  //已出現過的數不再處理。continue;printCircle(num);	 //輸出圈(只輸出第一次出現的情況)}}}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阳朔县| 娱乐| 客服| 泗洪县| 三穗县| 和龙市| 利辛县| 宜丰县| 扎兰屯市| 嘉峪关市| 滁州市| 旺苍县| 瑞安市| 阿坝县| 新津县| 松桃| 甘德县| 达尔| 阳山县| 临高县| 宜州市| 连山| 德庆县| 河北区| 南郑县| 磐石市| 玛多县| 伊川县| 民和| 土默特右旗| 德阳市| 阳春市| 洪湖市| 汕头市| 邵阳县| 汉川市| 晴隆县| 股票| 巴林右旗| 靖安县| 麻城市|