获取一个正整数的平方根近似值

版权声明:原创文章,转载请声名。 https://blog.csdn.net/qq_40707451/article/details/86303512

对于这个问题,最直接的方法是使用库函数,这里我们主要探讨如何自己实现一个sqrt函数。

函数形式:Sqrt(int val,double t)

val为所求数,t为精度。

如何求一个正整数的平方根呢?

对于一个正整数val,简单粗暴点直接0-val全部进行搜索,直到达到其精度。

这里采用二分的思想,假设val=10,查找区间为(0,10),取val的中间值mid=5,mid平方和val比较之后,确定下一次查找的区间变为(0,5),依次类推。

C代码表达如下:

double Sqrt(int val, double t)
{
	if (val < 0 || t<0)
		return 0;

	double left = 0;
	double right = val;
	double mid = (right + left) / 2;
	double offset = 2*t ;
	int count = 0;
	while (offset>t)
	{
		double sq = mid*mid;
		if (sq > val)
		{
			right = (left + right) / 2;
			offset = sq - val;
		}
		if (sq <= val)
		{
			left = (left + right) / 2;
			offset = val - sq;
		}
		mid = (left + right) / 2;
		count++;
	}
	printf("count:%d\n", count);
	return mid;
}

二分法查找的方式十分简洁,但是查找次数相对较多,我们可以使用另一种方法来更好的获取平方根。

牛顿迭代法

主要思想:使用切线来无限逼近,具体数学推导就不赘述了,大家可以百度。

C代码表达如下:

double SqrtIterator(int val,double t)
{
	double k = val;
	int count = 0;
	while (fabs(k*k-val)>t)
	{
		k=(k+val/k) / 2.0;
		count++;
	}
	printf("count:%d\n", count);
	return k;
}

代码相对于二分来说更加简洁,但这里使用了一个库函数,不过即使自己定义了也是很简洁的,而且迭代次数较少。

减少对库的依赖,拓展思路。

猜你喜欢

转载自blog.csdn.net/qq_40707451/article/details/86303512