求解一个数的平方根在C/C++中是有库函数sqrt(n)的,那么除此之外我们自己实现有哪些方式呢?

下面介绍牛顿迭代法和二分搜索两种思想,其共同点都是不断逼近目标值,直至到最后可以得到最接近目标值的范围,从而得到目标值。

这里是参考的大佬博客:https://www.cnblogs.com/qlky/p/7735145.html

1.牛顿迭代法  

公式即Xi+1 = (xi + n / xi) * 1 / 2;

这里贴个代码:

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

const int N = 1e-5;
double To_sqrt(double a){
	double x2 = 1.0, x1;
	while(1){
		x1 = x2;
		x2 = 0.5 * (x1 + a / x1);
		
		if(fabs(x1 - x2) < 1e-5){
			return x2;
		}		
	}
	
}
int main()
{
	double a;
	
	scanf("%lf", &a);
	
	printf("%.3f\n", To_sqrt(a));
	
	return 0;
}

注意:其中初值x2是任取的,试将初值x2换为任意数均可得到如上结果。只是迭代的次数有差异.

 

2.二分搜索法

二分的思想就是我们可以得知平方根一定是在0~n/2+1之间的,不过这个限于整数的平方根。

二分条件就是如果x = left + right >> 1  的x^2 == n      return x;

如果x^2 < n那么就left = x; x^2 > n right = x;

退出条件为i > j 退出后返回return j;

具体还是见巨佬的博客吧:https://www.cnblogs.com/qlky/p/7735145.html