java編程思想之吸血鬼數字

我覺得是時候了,所以我來了。

--------------------------

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

以兩個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)出發,減少了程序循環的次數,從而大大減少了程序的運行時間。達到了優化程序的目的。

如果大家還有更好的方法,或者覺得程序還能優化的更好的話。請多多指教哦。

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