package homework;
import java.util.Arrays;
import util.StringUtil;
/**
*
数学黑洞数6174,即卡普雷卡尔(Kaprekar)常数,
它的算法如下:
取任意一个4位数(4个数字均为同一个数的除外),
将该数的4个数字重新组合,形成可能的最大数和可能的最小数,再即将两者之间的差求出来;
对此差值重复同样过程,最后总是到达卡普雷卡尔黑洞6174,到达这个黑洞最多需要7个步骤.
例如:取1、2、3、4这4个数
大数:取这4个数字能构成的最大数,本例为4321;
小数:取这4个数字能构成的最小数,本例为:1234;
差:求出大数与小数之差,本例为:4321-1234=3087;
重复:对新数3087按以上算法求得新数为8730-0378=8352;
重复:对新数8352按以上算法求得新数为8532-2358=6174;
结论:对任何只要不是4位数字全相同的4位数,按上述算法,不超过7次激素,最终结果多无法逃出6174黑洞.
从文本框Text1中输入一个任意的数字不完全相同的四位正整数,在文本框Text2中输出掉进黑洞的步骤次数.
*
* Kaprekar 7641 - 1467= 6174
*
* @author ZengWenFeng
* @date 2023.11.03
* @email 117791303@qq.com
* @mobile 13805029595
*/
public class Math_2023_11_03_Kaprekar
{
public Math_2023_11_03_Kaprekar()
{
}
public static String calc(String num)
{
if (num == null || num.length() != 4)
{
return "-1";
}
char[] arrChar = num.toCharArray();
Arrays.sort(arrChar);
System.out.println(arrChar);
String strMin = new String(arrChar);
System.out.println("strMin : " + strMin);
String strMax = new StringBuilder(strMin).reverse().toString();
System.out.println("strMax : " + strMax);
int min = Integer.parseInt(strMin);
int max = Integer.parseInt(strMax);
int result = max - min;
System.out.println(" max - min = " + strMax + " - " + strMin + " = " + result);
if (result == 0)
{
return "0";
}
else
{
String strResult = Integer.toString(result);
// 不足四位数,补前导"0"
if (strResult.length() <= 4)
{
return StringUtil.getZeroStr(4 - strResult.length()) + strResult;
}
//
else
{
return strResult;
}
}
}
public static void main(String[] args)
{
String num = "888823";
System.out.println(num);
int cnt = 0;
while (true)
{
String temp = calc(num);
cnt++;
if (temp.equals("6174"))
{
calc(temp);
break;
}
else if (temp.equals("0"))
{
System.err.println("输入值[" + num + "]不能是4位相同数!");
break;
}
else if (temp.equals("-1"))
{
System.err.println("输入值[" + num + "]不是四位数!");
break;
}
else
{
num = temp;
}
}
System.out.println("cnt : " + cnt);
}
}
Kaprekar 7641 - 1467= 6174
spencer_tseng2023-11-04 0:32
相关推荐