Test83.java
引用C语言趣味程序百例精解之JAVA实现(83):卡布列克常数
http://blog.csdn.net/dearbaba2011/article/details/6927515
class="java" name="code">
package interviewTest;
import java.util.Scanner;
/**
在0到9这些数字中,任选4个数,组成最大的和最小的四位数,然后两数相减;再把结果的数字重新组成一个最大
的数与最小的数,再次相减;.这样不断重复,就会出现一个神秘数,这个神秘数是几?
6174
追答:
9876-1023=8853-3588=5265 6552-2556=3992 9932-2399=7533-3357=4176 7641-1467=6174 7641-1467=6174
* @author lengzl
* @email lengzhuolin@anjia365.com
* @create 2017年2月10日 下午10:09:27
*/
public class Test83{
public static void main(String args[]){
Scanner in=new Scanner(System.in);
System.out.println("Enter a number(non rep):");
int num = in.nextInt();
//4321
new Test83(). KaBuLieKe83(num,0);
}
/**
* 83。卡布列克常数,挺好玩,实现一下
*/
public void KaBuLieKe83(int n, int count) {
int cha = getTheMaxOrMin(n, 1) - getTheMaxOrMin(n, 0);
System.out.println(count + ":" + getTheMaxOrMin(n, 1) + "-"
+ getTheMaxOrMin(n, 0) + " = " + cha);
count++;
if (n == 6174) {
System.out.println("I did it 6174");
} else {
KaBuLieKe83(cha, count);
}
}
/**
* 获取重新排列后最大的数,如2310,得到3210,暂时只要四位
*/
public int getTheMaxOrMin(int n, int maxOrMin) {
if (n < 1000 || n > 9999)
return -1;
int a = getThe(n, 4);
int b = getThe(n, 3);
int c = getThe(n, 2);
int d = getThe(n, 1);
int temp = 0;
int[] list = new int[] { a, b, c, d };
for (int i = 0; i < 4; i++) {
for (int j = i; j < 4; j++) {
if (maxOrMin == 1 ? (list[i] < list[j]) : (list[i] > list[j])) {
temp = list[i];
list[i] = list[j];
list[j] = temp;
}
}
}
return list[0] * 1000 + list[1] * 100 + list[2] * 10 + list[3];
}
/**
* 获取N右数第i位
*/
public int getThe(int num, int i) {
if (i > getBitCount(num) || i < 1)
return -1;
return (num % ((int) Math.pow(10, i))) / (int) Math.pow(10, i - 1);
}
/**
* 获取一个数的位数
*/
public int getBitCount(int n) {
int i = 1;
while (n / 10 > 0) {
i++;
n /= 10;
}
return i;
}
}
结果:
//C:\bat>Java Test83
0:4321-1234 = 3087
1:8730-378 = 8352
2:8532-2358 = 6174
3:7641-1467 = 6174
I did it 6174