吸血鬼數字

吸血鬼數字是指位數爲偶數的數字,可以由一對數字相乘而得到,而這對數字各包含乘積的一半位數的數字,其中從最初的數字中選取的數字可以任意排序。

以兩個0結尾的數字是不允許的,例如,下列數字都是“吸血鬼”數字:   
1260 = 21 * 60   1827 = 21 * 87   2187 = 27 * 81

import java.util.Arrays;

/**
* 吸血鬼數字,高效率版本. 一個4位數字,可以拆分2個2位數數字的乘積,順序不限。 比如 1395 =15 * 93
*
*/
public class VampireNumber {
public static void main(String[] arg) {
String[] str1, str2;
int sum = 0;
int from;
int to;
int val;
int count = 0;
// 雙重循環窮舉
for (int i = 10; i < 100; i++) {
// j=i+1避免重複
from = Math.max(1000 / i, i + 1);
to = Math.min(10000 / i, 100);
for (int j = from; j < to; j++) {
val = i * j;
/*
* 假設val = 1000a + 100b + 10c + d, 因爲滿足val = x * y, 則有x = 10a + b, y = 10c + d
* 則val - x - y = 990a + 99b + 9c = 9 * (110a + 11b + c),
*所以val - x - y能被9整除。 所以滿足該條件的數字必定能被9整除,所以可以直接過濾其他數字。
*/
if (val % 100 == 0 || (val - i - j) % 9 != 0) {
continue;
}
count++;
str1 = String.valueOf(val).split("");
str2 = (String.valueOf(i) + String.valueOf(j)).split("");
Arrays.sort(str1);
Arrays.sort(str2);
if (Arrays.equals(str1, str2)) {// 排序後比較,爲真則找到一組
sum++;
System.out.println("第" + sum + "組: " + i + "*" + j + "=" + val);
}
}
}
System.out.println("共找到" + sum + "組吸血鬼數");
System.out.println(count);
}
}

結果:

第1組: 15*93=1395
第2組: 21*60=1260
第3組: 21*87=1827
第4組: 27*81=2187
第5組: 30*51=1530
第6組: 35*41=1435
第7組: 80*86=6880
共找到7組吸血鬼數
232

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章