1. 程式人生 > >求平方根的面試題

求平方根的面試題

style iostream namespace fff span lin ack color relative

前幾天在網上看到有人曬一道面試題,寫一個函數求平方根,該函數帶2個參數,第一個參數是目標數字,第二個參數是精度。即:

  1. double sqrt(double target, double g);
  2. a = sqrt(t, g);
  3. // 要求 |a^2 - t| < g

原文看到題目,就沒有接著往下看,想了一會兒,就有思路了,覺得拿來做面試題不錯。可是沒想到面了好幾個人,都沒有人能給出稍微好看點的代碼。難道大家工作久了之後,寫代碼反而生疏了嗎?一直手癢,今晚就花了幾分鐘實現了一下,感覺還是比較簡單的。實現完成之後,感覺不錯,給出的答案都滿足要求了,程序應該是對了。但是後來仔細一思考,又打了些程序處理過程的trace出來,發現不對了,有bug. 什麽bug呢?收斂比較慢,和原來二分查找的設想不一樣。雖然也能給出結果,但是收斂慢了,程序的實現和自己的思路不一致。想了一會兒,給出了正確的代碼。該sqrt函數實現大約24行左右,如下:

  1. #include <iostream>
  2. using namespace std;
  3. #define abs(X) ((X) > 0 ? (X) : -(X))
  4. double sqrt(double target, double g)
  5. {
  6. if (target < 0 || g < 0) return -1;
  7. double result = target;
  8. double small = target > 1 ? 0 : target;
  9. double big = target > 1 ? target : 1;
  10. while
    (true) {
  11. double diff = result * result - target;
  12. if (abs(diff) < g) {
  13. break;
  14. }
  15. else if (diff > 0) {
  16. big = result;
  17. }
  18. else if (diff < 0) {
  19. small = result;
  20. }
  21. result = (big + small) / 2;
  22. }
  23. return
    result;
  24. }
  25. int main()
  26. {
  27. cout << "sqrt(10, 0.1) = " << sqrt(10, 0.1) << endl;
  28. cout << "sqrt(25, 0.001) = " << sqrt(25,0.001) << endl;
  29. cout << "sqrt(0.09, 0.001) = " << sqrt(0.09, 0.001) << endl;
  30. cout << "sqrt(0.4, 0.01) = " << sqrt(0.4, 0.01) << endl;
  31. return 0;
  32. }


求平方根的面試題