java数字循环圈问题
任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,则前边补0)。如此往复,数字会落入某个循环圈(称为数字黑洞)。
比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。
请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。其中5位数全都相同则循环圈为 [0],这个可以不考虑。循环圈的输出格式仿照:
[82962, 75933, 63954, 61974]
其中数字的先后顺序可以不考虑。
import java.util.*;
public class Test_10 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<String> arry=new ArrayList<String>();
int i,j,k,m,n,p;
for(i=1;i<=9;i++)
for(j=0;j<=9;j++)
for(k=0;k<=9;k++)
for(m=0;m<=9;m++)
for(n=0;n<=9;n++){
String mun=String.valueOf(i)+j+k+m+n;
arry=Rual(mun,arry);
p=arry.size();
if(arry.get(p-1)!=arry.get(p-2))
System.out.println("["+arry.get(p-1)+" "+arry.get(p-2)+" "+arry.get(p-3)+" "+arry.get(p-4)+"]");
arry.clear();
}
}
public static ArrayList<String> Rual(String mun,ArrayList<String> arry){
int max=Max_Test(mun);
int min=Min_Test(mun);
int ag=max-min;
String str=String.valueOf(ag);
if(arry.size()>4&&arry.contains(str)){
arry.add(str);
}else{
arry.add(str);
while(str.length()!=5){
str+="0";
}
arry=Rual(str,arry);
}
return arry;
}
public static int Max_Test(String mun){
int[] ch=new int[5];
int max=0;
int i=0,j,k,temp;
for(i=0;i<5;i++){
ch[i]=mun.charAt(i);
}
for(j=0;j<4;j++)
for(k=j;k<5;k++)
if(ch[j]<ch[k]){
temp=ch[j];
ch[j]=ch[k];
ch[k]=temp;
}
max=(int)(ch[0]*Math.pow(10,4)+ch[1]*Math.pow(10, 3)+ch[2]*100+ch[3]*10+ch[4]);
return max;
}
public static int Min_Test(String mun){
int[] ch=new int[5];
int min=0;
int i=0,j,k,temp;
for(i=0;i<5;i++){
ch[i]=mun.charAt(i);
}
for(j=0;j<4;j++)
for(k=j;k<5;k++)
if(ch[j]<ch[k]){
temp=ch[j];
ch[j]=ch[k];
ch[k]=temp;
}
min=(int)(ch[4]*Math.pow(10,4)+ch[3]*Math.pow(10, 3)+ch[2]*100+ch[1]*10+ch[0]);
return min;
}
}