6174猜想 :
1955年,卡普耶卡(D.R.Kaprekar)研究了对四位数的一种变换:任给出四位数k0,用它的四个数字由大到小重新排列成一个四位数m,再减去它的反序数rev(m),得出数k1=m-rev(m),然后,继续对k1重复上述变换,得数k2.如此进行下去,卡普耶卡发现,无论k0是多大的四位数, 只要四个数字不全相同,最多进行7次上述变换,就会出现四位数6174.
例子1:
5200 - 0025 = 51757551 - 1557 = 5994
9954 - 4599 = 5355
5553 - 3555 = 1998
9981 - 1899 = 8082
8820 - 0288 = 8532
8532 - 2358 = 6174
7641 - 1467 = 6174
例子2:
9871 - 1789 = 80828820 - 0288 = 8532
8532 - 2358 = 6174
Java实现:
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int data = sc.nextInt();
compute(data,0);
}
public static void compute(int data,int old){
if(data >= 10000 || data < 1000){
System.out.println("输入数据不是4位数!");
return;
}
int[] bit = new int[4];
int index = 3;
while(data > 0){
bit[index] = data % 10;
data = data / 10;
index--;
}
boolean flag = true;
for(int i = 0; i < 3; i++){
if(bit[i] != bit[i + 1]){
flag = false;
break;
}
}
if(flag){
System.out.println("输入的数据各位数值一样!");
return;
}
MinMax mm = getMinMax(sort(bit));
int sub = mm.getMax() - mm.getMin();
System.out.println(mm.getMax() + "-" + mm.getMin() + "=" + sub);
if(sub == old){
return;
}
compute(sub,sub);
}
//因为排序数据比较少,直接用选择排序----升序
public static int[] sort(int[] bit){
int len = bit.length;
for(int i = 0; i < len; i++){
int tmp = i;
for(int j = i;j < len; j++){
if(bit[j] < bit[tmp]){
tmp = j;
}
}
swap(bit, i, tmp);
}
return bit;
}
//交换数组两个位置的值
public static void swap(int[] bit, int a, int b){
int tmp = bit[a];
bit[a] = bit[b];
bit[b] = tmp;
}
public static MinMax getMinMax(int[] bit){
int max = 0;
int min = 0;
for(int i = 0; i < bit.length; i++){
min = min * 10 + bit[i];
max = max * 10 + bit[bit.length - i - 1];
}
MinMax mm = new MinMax();
mm.setMax(max);
mm.setMin(min);
return mm;
}
}
class MinMax{
private int min;
private int max;
public int getMin() {
return min;
}
public void setMin(int min) {
this.min = min;
}
public int getMax() {
return max;
}
public void setMax(int max) {
this.max = max;
}
}