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;
}
相关推荐
方安乐1 小时前
python之向量、向量和、向量点积
开发语言·python·numpy
三品吉他手会点灯2 小时前
C语言学习笔记 - 20.C编程预备计算机专业知识 - 变量为什么必须的初始化【重点】
c语言·笔记·学习
sakiko_3 小时前
UIKit学习笔记1-创建项目(使用UIKit)、使用组件
笔记·学习
Old Uncle Tom3 小时前
OpenClaw 记忆系统 -- 记忆预加载
java·数据结构·算法·agent
会编程的土豆3 小时前
洛谷题单入门1 顺序结构
数据结构·算法·golang
小小小米粒3 小时前
Collection单列集合、Map(Key - Value)双列集合,多继承实现。
java·开发语言·windows
生信碱移3 小时前
PACells:这个方法可以鉴定疾病/预后相关的重要细胞亚群,作者提供的代码流程可以学习起来了,甚至兼容转录组与 ATAC 两种数据类型!
人工智能·学习·算法·机器学习·数据挖掘·数据分析·r语言
智者知已应修善业3 小时前
【51单片机中的打飞机设计】2023-8-25
c++·经验分享·笔记·算法·51单片机
czhc11400756634 小时前
C# 428 线程、异步
开发语言·c#
:1214 小时前
java基础
java·开发语言