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);	 //輸出圈(只輸出第一次出現的情況)}}}
新聞熱點
疑難解答