[算法] 计算平方根 2

在接受采访时,公司技术XXX, 程序员“高级”负责采访张志贤张志贤问一个问题:

“请写一个C程序计算平方根 2 整数x“

张志贤呵呵一笑,心想:“科技公司在越南问一个问题,很容易. 这是不是有些新来的家伙编程!”

并在眨眼间张志贤带着下面的代码正确答案:


#include<math.h>
#include<stdio.h>

int main()
{
    int x;
    printf("Input x: ");
    scanf("%d", &x);
    printf("Sqrt of %d = %fn", x, sqrt(x));
}
Input x: 3
Sqrt of 3 = 1.732051

节目边无 1 错误和正确的结果.

张志贤信心. 毫无疑问,该公司著名的XXX问这么愚蠢的问题! 它被认为是.

有经验的程序员的代码看起来张志贤和赞美: “你的基本!”. 张志贤高兴,并认为你必须确保 100% 开始工作. 就在还有一些其他的老程序员问:
“你回答的问题, 使用C库函数sqrt“这个时候

擦问题似乎更难. 张志贤开始思考. 过了一会儿,他开始挠头. 现在怎么算? 张志贤想了又想......

暂停! 面试官张志贤评论: “你还必须学习很多”. 张志贤伤心知道我滑. 然而, 无论它认为它应该滑出更多 1 什么是新的, 它要求面试官:

“我怎么能计算平方根? 难道我需要一个复杂的算法有很多行代码?”.

程序员“前辈”笑着回答: “计算机做一个快速计算, 而不是绝对的答案, 我能赶上它,我猜答案!”. 张志贤看起来愚蠢的脸, 老工程师从容微笑解释.

Y的平方根被定义为数x使得: X2 还有== X = Y / X. 如果x是X = Y结果 / X, 否则结果将是 1 X'为在x和y的范围/ X. 我不知道有多少,这些都是, 但我们有 1 想怎么弄 1 一些这大约是平均!

张志贤点头.

例: 计算平方根 2 的 3. 我猜的结果是 1.0. 这样的结果是不正确的, 如果答案是范围 1.0 和 3/1.0 = 2.0. 所需的平均时间 1 作为一个结果,我们有 1.5. 再试一次 1.5 和 3/1.5 = 2.0 作为一个结果,我们有 1.75! 多次迭代后会导致接近回答!

张志贤视线! 这位工程师笑着继续.

由于我们没有准确的结果, 应的迭代的数量将是无限的. 然而,在每次迭代, 我会尝试看看结果不够准确的要求还. 例如,如果当前的答案为x = 1.73, X2 = 2.99 我们只需要精度 2 逗号后的数, 然后 1.73 是合适的答案. 因此,我们将有一个程序,计算平方根 2 如下:

#include<math.h>
#include<stdio.h>

#define PRECISE 0.0001f

double mysqrt(int x)
{
    double guess = (double)x / 2;
    while (fabs(guess*guess - x)/x >= PRECISE)
        guess = (x/guess - guess) / 2 + guess;
    return guess;
}

int main(void)
{
    int x;
    printf("Input x: ");
    scanf("%d", &x);
    printf("Sqrt of %d = %fn", x, mysqrt(x));
    return 0;
}

输入X: 3
开方的 3 = 1.732051

和开明张志贤!

来源: ktmt.github.io/blog