求平方根的面试题

前几天在网上看到有人晒一道面试题,写一个函数求平方根,该函数带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. }


原文地址:https://www.cnblogs.com/june0507/p/9397237.html