題目:一個整數,它加上100後是一個完全平方數,再加上168又是一個完全平方數,請問該數是多少?
阿新 • • 發佈:2019-01-02
題目是copy的csdn論壇裡面的。當時,樓主給出了演算法:
public class HisTime { public static void main(String[] args) { long startTime = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { double x = Math.sqrt(i + 100); double y = Math.sqrt(i + 268); if (x == (int) x && y == (int) y) { System.out.println("這個數是:" + i); continue; } } long endTime = System.currentTimeMillis(); System.out.println("time:" + (endTime - startTime)); } }
當然,執行時間為:
雖然只有5ms,可是我看著這兒演算法有點不對,怎麼說呢,這應該是說用計算機用大量的資料強制算出來的,沒體現出演算法的優越性。想想應該有更簡單實用的演算法來計算這個值。
傳遞上演算過程吧,手寫版。
這樣我們就得到了m值的範圍,當然這是一個方面。(區間為[11,83],寫錯了 )
然後,其實雖然java的Math庫提供了許多實用的API,個人覺得開方應該比平方的運算耗時,當然這在單獨的少量資料時,感覺不明顯。
自己的程式碼:
public class TestTime { public static void main(String[] args) { TestTime testTime = new TestTime(); long startTime = System.currentTimeMillis(); // 確定 m的值範圍 for (int i = 11; i <= 83; i++) { // 得到 x的值 double x = testTime.testDataM(i); // 判斷 n是否為整數 if (testTime.testDataN(x)) { System.out.println("這個數是:" + x); } } long endTime = System.currentTimeMillis(); System.out.println("time:" + (endTime - startTime)); } // 判斷該數值是否符合: x+100=m^2 public double testDataM(double data) { // 求得: m^2 double mPow = Math.pow(data, 2); // 獲取x的值 double value = mPow - 100; return value; } // 判斷該數值是否符合:x+100+186=n^2 public boolean testDataN(double data) { // 獲取:n^2 double mPow = data + 100 + 168; // 對n 開方 double value = Math.sqrt(mPow); // 判斷 n開方後是否是整數 if (value == (int) value) { return true; } return false; } }
這個程式碼多了幾倍,呵呵。我寫了註釋的啦。
下面是執行的時間:
結果是1ms,效能提升很高,不是麼??
當然,肯定是有更好的方法的,有興趣大家一起討論吧!