解方程问题
1. 题目描述
给出等式8x4+7x3+2x2+3x+6=Y,能在x属于[0, 100]之间找到方程的解吗?
输入:
输入的第一行包含一个整数T(1
≤
\leq
≤T
≤
\leq
≤ 100),表示测试用例的数目。接着有T行,每行有一个实数Y(|Y|
≤
\leq
≤ 1e10);
输出:
对于每组测试用例,只能输出一个实数,表示方程的解,如果在0~100之间没有解,则输出“No solution!”;否则,输出实数解x(精确到小数点后4位)。
样例输入:
2
100
-4
样例输出:
1.6152
No solution!
2. 解题思路
根据方程可以看出该函数在0~100的定义域内单调递增,即满足二分的性质,故二分枚举x,即可得到方程的解。
3. 参考程序
#include <cstdlib>
#include <iostream>
using namespace std;
const double d=1e-8;
bool solve(double m, double y)
{
if(y - (8 * m * m * m * m + 7 * m * m * m + 2 * m * m + 3 * m + 6) > 0)
return true;
else
return false;
}
int main()
{
int n;
double l, r, m, y;
scanf("%d", &n);
while(n --)
{
l = 0;
r = 100;
scanf("%lf", &y);
if(y < 6 || y >807020306)
printf("No solution!\n");
else
{
while(r - l > d)
{
m = (l + r) / 2;
if(solve(m, y))
l = m;
else
r = m;
}
printf("%.4lf\n", l);
}
}
return 0;
}