我覺得是時候了,所以我來了。
--------------------------
吸血鬼數字是指位數爲偶數的數字,可以由一對數字相乘而得到,而這對數字各包含乘積的一半位數的數字,其中從最初的數字中選取的數字可以任意排序。
以兩個0結尾的數字是不允許的,例如,下列數字都是“吸血鬼”數字:
1260 = 21 * 60 1827 = 21 * 87 2187 = 27 * 81
順便介紹下僞吸血鬼數字:僞吸血鬼數和一般吸血鬼數不同之處在於其尖牙不強制是n/2個位的數,故僞吸血鬼數的位數可以是奇數。
--------------------------
我的程序是找出小於999999的吸血鬼數字。爲了方便下面的敘述,將吸血鬼數字的等式定義爲:a*b=c。
思路是兩層循環,從10*10開始尋找。這裏a、b、c都是整數,將它們轉換爲字符串數組形式,然後對其排序後的字符串進行比較。若兩個字符串相等則爲吸血鬼數字。看下面的代碼:
importjava.util.*; /** * 吸血鬼數字 * * @author Rlanffy * */ publicclassVampire { publicstaticvoidmain(String[] args) { longt1 = System.currentTimeMillis(); String[] str1, str2; intpro, sum = 0; for(inti = 10; i < 1000; i++) { for(intj = 10; j < 1000; j++) { pro = i * j; // 排除小於1000和大於999999的數字 if(pro < 1000|| pro > 999999) continue; //將乘積和乘數轉換爲字符串數組 str1 = String.valueOf(pro).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 + "="+ pro); } } } //計算程序執行的時間 System.out.println(System.currentTimeMillis()-t1); } }
運行程序,部分結果如下:
--------------------------------------------------------
第323組吸血鬼數字:765*963=736695
第324組吸血鬼數字:776*992=769792
**********************
第436組吸血鬼數字:981*216=211896
第437組吸血鬼數字:981*369=361989
第438組吸血鬼數字:983*65=63895
第439組吸血鬼數字:983*650=638950
第440組吸血鬼數字:984*807=794088
第441組吸血鬼數字:986*953=939658
第442組吸血鬼數字:992*776=769792
5442
---------------------------------------------
從結果中可以看出一下幾個問題:
(1):第438個等式出現了僞吸血鬼數字;
(2):第324個等式和和第442個等式是一樣的;
(3):程序運行的時間是5442毫秒,是不是覺得這個時間太長了呢。
這些都不是我們想要的。所以,我們需要改正程序,同時更需要優化程序。
爲了解決問題(1),在判斷的時候,我們可以判斷a和b的長度是否相等,不等則排除。j的起始數從i開始,這樣就避免了問題(2)。在排除僞吸血鬼數和減小j的循環次數後,相信第三個問題也會得到解決。從上面的問題出發,更改程序如下:
import java.util.*; /** * 吸血鬼數字 * * @author Rlanffy * */ public class Vampire { public static void main(String[] args) { long t1 = System.currentTimeMillis(); String[] str1, str2; int pro, sum = 0; for (int i = 10; i < 1000; i++) { for (int j = i; j < 1000; j++) { pro = i * j; int lengthi = String.valueOf(i).length(); int lengthj = String.valueOf(j).length(); // 排除小於1000和大於999999的數字 if (pro < 1000 || pro > 999999 || lengthi != lengthj) continue; // 將乘積和乘數轉換爲字符串數組 str1 = String.valueOf(pro).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 + "=" + pro); } } } // 計算程序執行的時間 System.out.println(System.currentTimeMillis() - t1); } }
運行程序,部分結果如下:
------------------------------------------------
第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
第8組吸血鬼數字:135*801=108135
**********************
第160組吸血鬼數字:891*945=841995
第161組吸血鬼數字:894*906=809964
第162組吸血鬼數字:896*926=829696
第163組吸血鬼數字:953*986=939658
2283
------------------------------------------------
從結果可以看出,從問題(1)出發,排除了乘法交換律和很多僞吸血鬼數字的結果。從問題(2)出發,減少了程序循環的次數,從而大大減少了程序的運行時間。達到了優化程序的目的。
如果大家還有更好的方法,或者覺得程序還能優化的更好的話。請多多指教哦。