您的位置:首页 > 其它

4位数吸血鬼数字算法

2017-07-02 00:00 120 查看
java编程思想(第四版) 第四章的练习10.

自己做的,如果还有可优化的地方请多指教

/**
* 吸血鬼数字是指位数为偶数的数字,由一对数字相乘而得到
* 且这对数字各包含一半位数的数字.排序不限,但是不允许
* 以00结尾
* 如:
* 1260 = 21 * 60
* 1827 = 21 * 87
*
* 相乘的时候只要用前一个因数和大于等于他的所有因数相乘就行了,
* 因为如果还是从10开始乘就会出现重复
* 如当a = 10,b = 11 和 a = 11,b = 10的情况
*/
@Test
public void getXiXueGui() {
// 既然要得到的是4位数的吸血鬼数字,那么两个因数必然都是2位数
// 所以必须是大于10 且小于 100
int a = 10;
int b = 10;
int num = 0; // 计数器
boolean boo = true;
// 只要a和b都小于100就肯定不会出现9999以上的数字,因为最大99 * 99 = 9801
while (a < 100 && b < 100) {
int c = a * b;
// 相乘结果是4位数,开始进一步判断是否吸血鬼数字
if (c > 1000 && c%100 != 0) {
String ab = a + "" + b;// 将两个因数物理拼接起来
String cc = c + "";

for (int i = 0; i < ab.length(); i++) {
char at = ab.charAt(i);
String cstr = String.valueOf(at);
// 只要有一个数字没有在乘积中就不是吸血鬼数字
if (!cc.contains(cstr)) {
boo = false;
break;
} else {
/* 如果本次在因数字符串中的数字在乘积字符串中包涵,那么就把乘积字符串中的这个字符删掉.
* 避免同一个字符被重复匹配的问题
*/
cc = cc.replaceFirst(cstr, "");
}
}

if (boo) {
num++;
System.out.println("吸血鬼数字:" + c + " = " + a + " + " + b);
}
}

// 如果b还小于99就让b+1,否则a+1,b = a + 1 + 1开始新一轮计算
if (b < 99) {
b++;
} else {
a++;
b = a;
}
// 重置标记
boo = true;
}
System.out.println("4位数吸血鬼数字共有: " + num + " 个");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  吸血鬼数字