卡布列克常数的java实现

4 篇文章 0 订阅
3 篇文章 0 订阅
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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值