1. 程式人生 > >題目:一個整數,它加上100後是一個完全平方數,再加上168又是一個完全平方數,請問該數是多少?

題目:一個整數,它加上100後是一個完全平方數,再加上168又是一個完全平方數,請問該數是多少?

題目是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,效能提升很高,不是麼??

當然,肯定是有更好的方法的,有興趣大家一起討論吧!