解方程一
描述
给定方程 y = 8x^4 + 7x^3 + 2x^2 + 3x + 6,请计算 x 在 [0, 100] 范围内的解。
输入
输入数据第一行是一个正整数 T (1 <= T <= 100),表示有 T 组测试数据。
接下来 T 行,每行包含一个实数 y(fabs(y) <= 1e10)。
输出
请计算并输出方程在范围 [0, 100] 内的解,结果精确到小数点后 4 位。
如果无解,则请输出“No solution!”。
输入样例 1
2 100 -4
输出样例 1
1.6152 No solution!
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
// 定义函数f(x),用于计算x的4次方加7乘x的3次方加2乘x的2次方加3乘x加6
double f(double x)
{
return 8 * pow(x, 4) + 7 * pow(x, 3) + 2 * pow(x, 2) + 3 * x + 6;
}
// 定义函数find_root(y),用于查找函数f(x)等于y的x的值
double find_root(double y)
{
// 定义x的下限为0,上限为100
double low =0.0, high = 100.0;
// 定义x的中值,用于计算函数f(x)的值
double mid,value;
// 当x的下限与上限之差大于1e-6时,进行循环
while (high - low > 1e-6)
{
// 计算x的中值
mid = (low + high) / 2.0;
// 计算函数f(x)的值
value = f(mid);
// 如果函数f(x)的值等于y,则返回x
if (fabs(value - y) < 1e-6)
return mid;
// 如果函数f(x)的值大于y,则将x的下限设置为x的中值
else if (f(mid) > y)
high = mid;
// 如果函数f(x)的值小于y,则将x的上限设置为x的中值
else
low = mid;
}
// 返回x的下限与上限之平均值
return (high + low) / 2;
}
int main() {
// 定义输入的组数
int T;
// 输入组数
scanf("%d", &T);
// 当组数大于0时,进行循环
while (T--)
{
// 定义输入的y值
double y;
// 输入y值
scanf("%lf", &y);
// 如果y值小于f(0)或者大于f(100),则输出"No solution"
if (y<f(0) || y>f(100))
printf("No solution");
// 否则,调用函数find_root(y),计算函数f(x)等于y的x的值,并输出结果
else
{
double root = find_root(y);
printf("%.4lf", root);
}
}
// 返回0
return 0;
}