zoukankan      html  css  js  c++  java
  • 求平方根的面试题

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


  • 相关阅读:
    pxeconfig 4.2.0 发布,PXE 首要启动设备
    Nutz 1.b.48 发布,Java 应用框架
    Exponent CMS 2.2.0 Beta3 发布
    持续交付加速了创新的步伐
    Fork CMS 3.5.1 发布,PHP 的 CMS 系统
    Org Mode 8.0 发布,TODO 管理工具
    Apache OpenNLP 1.5.3 发布
    结巴分词 0.27 发布,Python 中文分词组件
    Linux 内核 3.9 开发统计
    红帽发布开源的 OpenStack RDO
  • 原文地址:https://www.cnblogs.com/june0507/p/9397237.html
Copyright © 2011-2022 走看看