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
代码如下
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;}}这就是本题的核心算法
三、完整代码
#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;
}