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;
}
相关推荐
pen-ai10 小时前
【YOLO系列】 YOLOv1 目标检测算法原理详解
算法·yolo·目标检测
wbs_scy10 小时前
C++11:类新功能、lambda与包装器实战
开发语言·c++
知识分享小能手10 小时前
Oracle 19c入门学习教程,从入门到精通,Oracle 的闪回技术 — 语法知识点与使用方法详解(19)
数据库·学习·oracle
不光头强10 小时前
kafka学习要点
分布式·学习·kafka
凉、介10 小时前
ACRN Hypervisor 简介
笔记·学习·虚拟化
飞鹰5110 小时前
深度学习算子CUDA优化实战:从GEMM到Transformer—Week4学习总结
c++·人工智能·深度学习·学习·transformer
2301_7657031411 小时前
C++中的职责链模式实战
开发语言·c++·算法
顾西爵霞11 小时前
个人学习主页搭建指南:从毛坯房到精装户型
学习·html
StandbyTime11 小时前
《算法笔记》学习记录-第一章
c++·算法·算法笔记
hhhjhl11 小时前
flutter_for_openharmony逆向思维训练app实战+学习日历实现
学习·flutter