简单题-不用库函数,求解一个数字的平方根

题目:

如标题所示,不用平方根库函数,求解一个数字的平方根。

分析:

这个问题有两个思路:

思路1:采用二分的方式(无处不在的二分),上界初始化为数字本身,下界初始化为1,这样用二分,判断中间数字的平方和目标数字比较,再修改上界和下界,直到小于一定的阈值。

思路2:采用牛顿法(数值分析中提到),采用微分的方式,从初始点开始,每次迭代,微分求解切线,然后求解切线和x轴的交点,再以这个交点作为起点,迭代进行。比如求解24,那么写出函数:

f(x) = x^2 - 24

我们目标就是求解这个函数的根,函数一阶导数是:

f'(x) = 2*x

起始点可以选择x0 = 24,通过求解,可以得到下一个迭代点的公式为:

x1 = -f(x0) / f'(x0) + x0

这样迭代下去,直到最后小于一定的阈值。

算法代码如下:

/*
 * square.cpp
 *
 *  Created on: 2012-10-4
 *      Author: happier
 */


#include 
#include 
#include 
using namespace std;
#define E 0.001		//精度设置

/*
 * 二分法求解
 */
double bSearch(double number, int *count)
{
	//int count = 0;
	double start = 1.0;
	double end = number;
	while(true)
	{
		(*count)++;
		double mid = (start + end) / 2;
		if(mid * mid - number <= E && mid * mid - number >= -E)
			return mid;

		if(mid*mid - number > E)
			end = mid;
		else
			start = mid;
	}

	return 0;
}

/*
 * 牛顿法求解
 */
double newton(double number, int *count)
{
	double x0 = number;
	double x1;
	while(true)
	{
		(*count)++;
		x1 = -(x0*x0 - number) / (2 * x0) + x0;
		if(x1 * x1 - number <= E && x1 * x1 - number >= -E)
			return x1;
		x0 = x1;
	}

	return 0;
}

int main()
{
	int count = 0;	//统计迭代次数
	cout << "Please input the number::" << endl;
	double number;
	cin >> number;

	cout << bSearch(number, &count) <

总结:

通过运行发现,牛顿法的求解速度要比二分法快很多,例如求解30000,牛顿法只要11次迭代,可以达到0.001精度,但是二分法需要33次,所以数值分析普遍采用牛顿法进行求根。

你可能感兴趣的:(算法)