持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情
前言
c语言如何实现平方根?这个问题大家肯定都知道。那么如何不用平方根函数就实现呢?这个问题就有些难了。接下来请随我一起看看。
力扣对应题目(69)
给你一个非负整数 x
,计算并返回 x
的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
平方根函数(sqrt)介绍
sqrt的使用1——头文件
#include<math.h>
sqrt用的是math头文件(当然stdio也不要忘)
sqrt的使用2——格式
sqrt(n)
sqrt和普通函数是差不多的,都是...(...)
sqrt的使用3——实战
提示:
向下取整可以用floor函数
代码实现
#include<stdio.h>
#include<math.h>
int main(){
int n;
scanf("%d",&n);
printf("%d",(int)floor(sqrt(n)));
}
不用sqrt函数
思路1
使用pow函数
pow函数简介
pow(x,y)
x为底数,y为指数。即x的y次方。
实战
根据初中知识我们得知,求x的平方根等于x的1/2次方,于是可得代码:
pow(x,o.5)
(这里只给最关键的代码,其他请自行补全)
思路2
二分查找(力扣题解,这里我直接复制过来再进行解释了)
复制粘贴部分
由于 xx 平方根的整数部分ans 是满足 k^2≤x 的最大 k 值,因此我们可以对 kk 进行二分查找,从而得到答案。
二分查找的下界为 0,上界可以粗略地设定为x。在二分查找的每一步中,我们只需要比较中间元素 mid 的平方与 x的大小关系,并通过比较的结果调整上下界的范围。由于我们所有的运算都是整数运算,不会存在误差,因此在得到最终的答案 ans 后,也就不需要再去尝试ans+1 了。
代码部分
int mySqrt(int x){
int left = 0, right = x, ans = -1;
while (left <= right) {
int mid = left + (right - left) / 2;
if ((long long)mid * mid <= x) {
left = mid + 1;
ans = mid;
} else {
right = mid - 1;
}
}
return ans;
}