本文主要是介绍卡布列克常数的java实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Test83.java此题来源为 廖永鹏的 贵阳面试题.
主要目的考算法.
[quote]C语言趣味程序百例精解之JAVA实现(83):卡布列克常数
http://blog.csdn.net/dearbaba2011/article/details/6927515
[/quote]
有改进
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 lengzhuolin@anjia365.com * @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实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!