任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,则前边补0)。如此往复,数字会落入某个循环圈(称为数字黑洞)。比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。欢迎提出意见与建议!
关于黑洞数,详细可见百度百科 点击打开链接
package net.as.cn;
import java.util.ArrayList;
import java.util.Scanner;
/**
* 黑洞数算法
* @author chenaschen
*
*/
public class HeiDongShu{
public static ArrayList<Integer> list = new ArrayList<Integer>();
public static void main(String[] agrs)
{
// Scanner input = new Scanner(System.in);
// String str = input.nextLine();
String s = "34256";
getNum(s);
System.out.print("[");
for(int i=0; i<list.size()-1; i++)
{
System.out.print(list.get(i)+", ");
}
System.out.println(list.get(list.size()-1)+"]");
}
/**
* 从大到小排序
* @param c
* @return
*/
public static String sortMax(char[] c){
StringBuffer sb = new StringBuffer();
for(int i=0; i<c.length; i++)
{
int k = i;
for(int j=i+1; j<c.length; j++){
if(c[k]<c[j])
{
char temp = c[j];
c[j] = c[k];
c[k] = temp;
}
}
sb.append(c[k]);
}
return sb.toString();
}
/**
* 从小到大排序
* @param c
* @return
*/
public static String sortMin(char[] c){
StringBuffer sb = new StringBuffer();
for(int i=0; i<c.length; i++)
{
int k = i;
for(int j=i+1; j<c.length; j++){
if(c[k]>c[j])
{
char temp = c[j];
c[j] = c[k];
c[k] = temp;
}
}
sb.append(c[k]);
}
return sb.toString();
}
/**
* 利用递归
* @param s
*/
public static void getNum(String s)
{
Integer max=Integer.parseInt((sortMax(s.toCharArray())));
Integer min=Integer.parseInt(sortMin(s.toCharArray()));
Integer n = max - min;
if(list.contains(n))
{
for(int j=0; j<list.indexOf(n); j++)
{
list.remove(j);
}
return;
}else
{
list.add(n);
getNum(n.toString());
}
}
}