C语言简易求正数平方根的几种办法

本文介绍了三种求解正数平方根的方法:二分搜索法、迭代法和递归迭代法。二分搜索法通过不断调整搜索范围找到答案;迭代法通过公式反复计算直至满足精度要求;递归迭代法结合函数递归和迭代,逐步逼近结果。每种方法都要求精度达到e < 10^-6。

题目:

求一个正数的平方根,精度要求 e < 10^-6


1.二分搜索法

解题思路:

对于二分法的使用,大多数情况下,mid值便是我们要的答案

  • 令low=0 high=x
  • 则二分搜索范围为[low,high]
  • 令 mid=(low+high)/2
  • 以fabs(mid * mid - x) >=1e-6为循环条件
  • mid * mid > x 则 high = mid 继续循环
  • mid * mid < x 则 low = mid 继续循环
  • 都不符合 则 mid值为结果
#include <stdio.h>
#include <math.h>

//声明函数
double gen(double high);

int main() {
    double x;
    printf("请输入一个正数\n");
    scanf("%lf", &x);

    //输出结果
    printf("%.2lf", gen(x));

    return 0;
}

//二分法求平方根 函数定义
double gen(double high) {
    double low = 0;
    double x = high;
    double mid = low + (high - low) / 2;

    //循环
    while (fabs(mid * mid - x) >= 1e-6) {
        mid = low + (high - low) / 2;
        if (mid * mid > x) high = mid;
        else if (mid * mid < x) low = mid;
    }

    return mid;
}

// 运行结果
// 请输入一个非负数
// 4
// 2.00

2.迭代法: 

对于   x=\sqrt{a} 

解题思路:

迭代法 公式:x_{n+1}=\frac{1}{2}(x_{n}+\frac{a}{x_{n}})

  • 设定一个的初值 x0=a/2.0
  • 套入公式求出下一个值 x1
  • 再将 x1 套入公式求 下一个值
  • 当满足 前后求出的两个 x 值 相减的绝对值 <10^-6

输出结果

#include <stdio.h>
#include <math.h>

int main() {
    float a, x0, x1;
    printf("请输入一个正数\n");
    scanf("%f", &a);

    //设定一个 x0 初始值,求出下一个 x值
    x0 = a / 2.0;
    x1 = (x0 + a / x0) / 2;

    //循环套公式 误差允许则输出
    do {
        x0 = x1;
        x1 = (x0 + a / x0) / 2;
    } while (abs(x0 - x1) >= 1e-6);

    printf("%.2f 的平方根为 %.2f", a, x1);

    return 0;
}

// 运行结果
// 请输入一个正数
// 2
// 2.00 的平方根为 1.42

3.递归迭代法

简单理解什么是递归

个人对于递归的简单理解:

  1. 你可以想象 你在爬一座 山
  2. 沿途设置了 几个点 每个点放了一些钱
  3. 上下山都是走同一条路
  4. 如果有人在山底,问你:所有点共有多少钱
  5. 你于是 一步一步往上爬 每个点每个点的看
  6. 第一个点 说你得继续爬上去看上一个点
  7. 知道上一个点有多少钱 才可以知道它有多少钱
  8. 第N个点也是如此
  9. 最后你爬到了山顶的点,知道山顶有多少钱了
  10. 于是你 回头走 重新查看下面的每个点
  11. 每个点 相当于一个函数
  12. 回头点函数自变量由已知点的数 构成
  13. 不断地代入

最后,你知道了所有的点的钱数,输出结果

解题思路:

虽然是递归做法,公式还是要用的

  • 不符合误差范围 就继续调用函数
  • 符合了,就输出结果

迭代法 公式:x_{n+1}=\frac{1}{2}(x_{n}+\frac{a}{x_{n}})

  • 设定一个的初值 x0
  • 套入公式求出下一个值 x1
  • 再将 x1 套入公式求 下一个值
  • 当满足 前后求出的两个 x 值 相减的绝对值 <10^-6

输出结果

#include <stdio.h>
#include <math.h>

// 声明函数
double degui(double a, double x);

int main() {
    double a;
    printf("请输入一个正数\n");
    scanf("%lf", &a);

    // 初始 x0 值
    double x0 = a / 2.0;
    // 调用函数 输出结果
    printf("%.2lf 的平方根为 %.2lf", a, degui(a, x0));

    return 0;
}

double degui(double a, double x0) {
    double x1, sum;

    // 重新初始 函数调用 的 x0
    x1 = (x0 + a / x0) / 2;

    // 判断是否重新调用函数 后返回结果
    if (abs(x0 - x1) >= 1e-6) {
        sum = degui(a, x1);
    } else {
        sum = x1;
    }

    return sum;
}

// 运行结果
// 请输入一个正数
// 4
// 4.00 的平方根为 2.00
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃饭用勺子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值