kaprekar常数(6174猜想)

6174猜想 :

1955年,卡普耶卡(D.R.Kaprekar)研究了对四位数的一种变换:任给出四位数k0,用它的四个数字由大到小重新排列成一个四位数m,再减去它的反序数rev(m),得出数k1=m-rev(m),然后,继续对k1重复上述变换,得数k2.如此进行下去,卡普耶卡发现,无论k0是多大的四位数, 只要四个数字不全相同,最多进行7次上述变换,就会出现四位数6174.

例子1:

5200 - 0025 = 5175
7551 - 1557 = 5994
9954 - 4599 = 5355
5553 - 3555 = 1998
9981 - 1899 = 8082
8820 - 0288 = 8532
8532 - 2358 = 6174
7641 - 1467 = 6174

例子2:

9871 - 1789 = 8082
8820 - 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;
	}
	
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值