下面是用二分法和牛顿迭代法求一个正数的平方根。
二分法
这里的题目稍微宽了一点点,包含了整数和小数的情况,这里二分法就不用多说了,如果中间值的平方与目标值在误差范围内,则返回,否则根据大小情况改变左/右区间的端点。
#include<iostream>
using namespace std;
int main()
{
double eps = 1e-6;
double k = 0.8; # 输入正数
double l = 0.0,r,mid;
if (k>=1) r = k; # 若输入正数大于1,则右端点设为 k
if (k<1) r = 1; # 若输入整数小于1,则右端点设为 1
while (fabs(l-k/l)>eps)
{
mid = l + (r - l) /2 ;
if (mid<k/mid)
{
l = mid;
}
else {
r = mid;
}
}
cout << l << endl;
return 0;
}
上面主要是注意两点小细节,一个是 mid 的计算方式:
mid = (l+r)/2;
mid = l + (k-l)/2; # 推荐
还有判断条件:
if(mid*mid<k){}
if(m