一、题目
给定方程 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;
}