C语言应用实例:解方程(二分查找)

一、题目

给定方程 8∗x4+7∗x3+2∗x2+3∗x+6==y,请计算 x 在 0,100 范围内的解。

++要求:++ 输入数据首先是一个正整数 T (1<=T<=100),表示有 T 组测试数据。

接下来 T 行,每行包含一个实数 Y (∣Y∣<=1e10)。

请计算并输出方程在范围 0,100 内的解,结果精确到小数点后 4 位。

如果无解,则请输出"No solution!"。

二、题解

作为一个正常人,我们最先想到的一定是暴力求解

但需要注意的是,题目要求精确到四位小数

那么计算量便会直线飙升

此时我们便可以使用二分查找的方法

简单来说就是,取定义域中值mid,和y比大小,如果mid大则缩小定义域右边界为mid,反之则赋值左边界为mid

代码如下

cs 复制代码
 double left = 0, right = 100;
        double mid, result;+6
        
        // 二分精度控制到1e-8,确保结果精确到小数点后4位
        while (right - left > 1e-8) {
            mid = (left + right) / 2;
            result = f(mid);
            
            if (fabs(result - y) < 1e-8) {
                break;
            }
            
            if (result < y) {
                left = mid;
            } else {
                right = mid;
            }
        }

这就是本题的核心算法

三、完整代码

cs 复制代码
#include <stdio.h>
#include <math.h>

// 定义方程函数
double f(double x) {
    return 8*pow(x,4) + 7*pow(x,3) + 2*pow(x,2) + 3*x + 6;
}

int main() {
    int T;
    scanf("%d", &T);
    
    while (T--) {
        double y;
        scanf("%lf", &y);
        
        // 检查y是否在函数值范围内
        if (y < f(0) || y > f(100)) {
            printf("No solution!\n");
            continue;
        }
        
        // 二分法求解
        double left = 0, right = 100;
        double mid, result;+6
        
        // 二分精度控制到1e-8,确保结果精确到小数点后4位
        while (right - left > 1e-8) {
            mid = (left + right) / 2;
            result = f(mid);
            
            if (fabs(result - y) < 1e-8) {
                break;
            }
            
            if (result < y) {
                left = mid;
            } else {
                right = mid;
            }
        }
        
        // 输出结果,保留4位小数
        printf("%.4lf\n", mid);
    }
    
    return 0;
}
相关推荐
lie..7 分钟前
30天从零开始学AI应用开发(Day 19):项目二完结:RAG 知识库问答系统,把自己攒的资料变成私人顾问
开发语言·人工智能·python
SWAGGY..11 分钟前
【C++进阶】:(7)红黑树的原理与 C++ 实现:结构设计、插入调整及性质验证
android·java·开发语言·c++·算法
-dzk-14 分钟前
【技巧】LC 31.下一个排列
算法
(Charon)19 分钟前
【C++面试】堆内存与栈内存:string、vector和对象到底存在哪里
开发语言·c++·面试
m4Rk_27 分钟前
【论文阅读】Agent 记忆机制(92):EMPO²——让 Memory 从经验复用走向主动探索
论文阅读·人工智能·学习·开源·github
谢亮_vipxieliang28 分钟前
Go defer、panic与recover核心知识点
开发语言·后端·golang
她说彩礼65万32 分钟前
C语言 assert
java·linux·c语言
迪康Defender41 分钟前
终端安全事后追溯能力解析:本地审计模块设计思路与落地实践
运维·开发语言·人工智能·安全·php·安全威胁分析·运维开发
(Charon)43 分钟前
【C++面试】迭代器失效是什么?vector、list、map中如何避免迭代器失效
c++·算法·面试
yujunl44 分钟前
开发一个可以用APIFOX来调试的接口
开发语言