卡布列克是一位数学家,他在研究数字时发现:任意一个不是有完全相同数字的组成的四位数,如果对它们的每位数字重新排序,组成一个最大的数各一个最小的数,然后用最大数减去最小数,差不够四位数时补零,类推下去,最后将变成一个固定的数:6174,这就是卡布列克常数。例如:4321-1234=3087 8730-378=8352 8532-2358=6174 7641-1467=6174。
验证卡布列克运算,任意一个四位数,只要它们各个位上的数字是不全相同的,就有这样的规律:
(1)将组成该四位数的四个数字由大到小排列,形成由这四个数字构成的最大的四位数;
(2)将组成该四位数的四个数字由小到大排列,形成由这四个数字构成的最小的四位数(如果四个数中含有0,则得到的数不足四位);
(3)求两个数的差,得到一个新的四位数(高位零保留)。
重复以上过程(最多7步),最后得到的结果是6174,这个数被称为卡布列克常数。
所以6174也被叫做黑洞数,因为这种现象类似黑洞(进去后就出不来了),也叫“6174问题”,上述变换称为卡普耶卡变换,简称 K 变换。
下面我们用程序来验证这个不可思议的事实:
public class HeiDong6174 {
public static void main(String[] args){
helper(1050,0);
}
private static void helper(int num, int count) {
if(num == 6174){
System.out.println("共执行了" + count + "步");
return;
}
String s = String.valueOf(num);
char[] cs = s.toCharArray();
if(cs.length != 4){
System.out.println("请输入一个三位数或者四位数");
return;
}
for(int i = 0; i < cs.length; i++){
for(int j = i; j < cs.length; j++){
if(cs[i] < cs[j]){
char temp = cs[i];
cs[i] = cs[j];
cs[j] = temp;
}
}
}
char[] cs2 = new char[cs.length];
for(int i = 0; i < cs.length; i++){
cs2[i] = cs[cs.length-1-i];
}
int n1 = Integer.parseInt(new String(cs));
int n2 = Integer.parseInt(new String(cs2));
int new_num = n1 - n2;
System.out.println(n1 + "-" + n2 + "=" + new_num);
if(new_num / 1000 < 1)//如果不足四位数,高位补0,等价于低位补0
new_num *= 10;
helper(new_num,count+1);
}
}
测试结果:
6174是卡布列克常数的代名词,还有其他位数的情况:
三位数也有一数495,任何三位数经过这样的运算都会对应到495。其它位数就没有像三位数及四位数这样单纯的状况,会对应到不只一种结果,或是进入数字循环(即数个数循环对应)
5位数的状况:没有黑洞,有3个循环
- 71973 83952 74943 62964 71973
- 82962 75933 63954 61974 82962
- 53955 59994 53955
6位数的状况:有2个黑洞631764、549945,还有1个7个成员的循环
- 420876 851742 750843 840852 860832 862632 642654 420876
7位数的状况:没有黑洞,只有1个8成员的循环
- 7509843 9529641 8719722 8649432 7519743 8429652 7619733 8439522 7509843
8位数的状况:有2个黑洞63317664、97508421
9位数的状况:有2个黑洞554999445、864197532
10位数的状况:有3个黑洞6333176664、9753086421、9975084201