1. 概述
Implement int sqrt(int x)
.
Compute and return the square root of x.
由上可知这道题的意思是想用程序自己去实现求取一个数的平方根运算。
2. 编码
2.1 方法1
最简单有效的方法就是调用C++的sqrt()函数,但是这明显有作弊之嫌,出题人的意思也不是这样的。
对应的实现的代码也很简单,就一句话
class Solution {
public:
int mySqrt(int x)
{
return (int)(sqrt(x));
}
}
2.2 方法2
这里采用的二分法进行的
class Solution
{
public:
//二分查找法
int mySqrt(int x)
{
if(0==x || 1==x)
return x;
bool negative = x<0?true:false;
double mum(abs(x));
double left(0.0); //左边的数字
double right((double)x);
double midle((right-left)/2.0);
double e(0.2); //误差
double distance(x - midle*midle);
while(abs(distance) > e)
{
if(distance > 0)
{
left = midle;
}
else
{
right = midle;
}
midle = (right + left) /2.0;
distance = x - midle*midle;
}
int value(midle);
return value;
}
};
2.3 方法3
采用牛顿法迭代公式来求解求平方根问题,原理如下
牛顿迭代法(Newton's method)又称为牛顿-拉夫逊方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x) = 0的根。牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程f(x) = 0的单根附近具有平方收敛,而且该法还可以用来求方程的重根、复根。另外该方法广泛用于计算机编程中。
设r是f(x) = 0的根,选取x0作为r初始近似值,过点(x0,f(x0))做曲线y = f(x)的切线L,L的方程为y = f(x0)+f'(x0)(x-x0),求出L与x轴交点的横坐标 x1 = x0-f(x0)/f'(x0),称x1为r的一次近似值。
过点(x1,f(x1))做曲线y = f(x)的切线,并求该切线与x轴交点的横坐标 x2 = x1-f(x1)/f'(x1),称x2为r的二次近似值。重复以上过程,得r的近似值序列,其中x(n+1)=x(n)-f(x(n))/f'(x(n)),称为r的n+1次近似值,上式称为牛顿迭代公式。
根据牛顿迭代的原理,可以得到以下的迭代公式:X(n+1)=[X(n)+p/X(n)]/2=[X(n)*X(n)+p]/(2*X(n)); p是需要求取平方的数,也就是这道题中的输入。
lass Solution {
public:
//牛顿公式迭代法
int mySqrt(int x)
{
if(0==x || 1==x)
return x;
double num(x);
double e(0.01);
double X(x);
while(abs(X*X - num) > e)
{
X = (X*X + num) / (2.0*X);
}
return (int)X;
}
}