c如何实现平方根?(函数+不用函数)

297 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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;
    }