目录
  1. 1. X的平方根
    1. 1.1. 题目描述
    2. 1.2. 题目分析
    3. 1.3. 代码实现
    4. 1.4. 运行结果
    5. 1.5. 总结
  2. 2. x的平方根2
    1. 2.1. 题目描述
    2. 2.2. 题目分析
    3. 2.3. 代码实现
    4. 2.4. 运行结果
X的平方根

X的平方根

题目描述

给定一个数,写出算法,将其开方,结果保留6位小数。

输入一个数(可以是小数),输出结果为其平方根,结果保留6位小数

题目分析

采用浮点数二分法,对齐进行找值。假定中值为最终解,给定上下限,然后求中值;比较中值平方和与x的大小,并修改其上下限,依次循环

代码实现

#include<iostream>
using namespace std;

// 开平方
int main(){
double x;
scanf("%lf", &x);
double l = 0, r = x;
while(r - l >= 1e-8) // 比保留小数位数多 2 。保留 6 位小数,则 1e-8
{
double mid = (l + r) / 2;
if(mid * mid >= x) r = mid;
else l = mid;
}
printf("%lf\n", l);
return 0;
}

运行结果

输入

3.5

输出

1.870829

总结

二分法思维固然简单,但是精度需要得以控制,精度控制不当,则容易陷入死循环。

x的平方根2

题目描述

实现 int sqrt(int x) 函数。

计算并返回 x 的平方根,其中 x 是非负整数。

由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。

输入: 4
输出: 2
输入: 8
输出: 2
说明: 8 的平方根是 2.82842...,
由于返回类型是整数,小数部分将被舍去。

题目分析

题目要求保留整数,此处就得知道,所得出的整数的平方一定会小于等于x,即$n^2<=x$,且$(n+1)^2>x$,满足此条件即可确定为其取整后的平方根。

代码实现

#include<iostream>
using namespace std;

int mySqrt(int x){
// 平方根小于等于其数一半,因此可以缩小右边距
int l = 0, r = x / 2;
while(l <= r)
{
int mid = (l + r) / 2;
if(mid * mid <= x && (mid + 1) * (mid + 1) > x) return mid;
// 调整边界
else if(mid * mid > x) r = mid - 1;
else l = mid + 1;
}
return l;
}

int main(){
int x;
scanf("%d", &x);
printf("%d", mySqrt(x));
return 0;
}

运行结果

输入

98

输出

9
文章作者: Jachie Xie
文章链接: https://xjc5772.github.io/2020-03/08/%E7%AE%97%E6%B3%95/%E7%AE%97%E6%B3%95%E5%9F%BA%E7%A1%80/%E4%BA%8C%E5%88%86/%E5%BC%80%E5%B9%B3%E6%96%B9/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 XJC&Blog
打赏
  • 微信
  • 支付宝

评论