卡布列克常数的java实现

阅读更多
Test83.java
此题来源为 廖永鹏的 贵阳面试题.
主要目的考算法.
引用
C语言趣味程序百例精解之JAVA实现(83):卡布列克常数
http://blog.csdn.net/dearbaba2011/article/details/6927515

有改进

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 [email protected]
 * @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

你可能感兴趣的:(java)