题解
2025-06-12 21:21:48
发布于:广东
2阅读
0回复
0点赞
知识点!!!
二分答案
这道题答案(实根)的出现很有规律:
根与根之差绝对值>=1 且 只出现在 -100~100间
所以,遍历 -100~100,每次判断当前区间(i~i+1)是否有实根
如果存在,开始二分答案算法
注意:二分的是答案的精度(实根都是两位小数)
代码如下:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double dou;
typedef string str;
//二分精度
const dou N = 1e-3;
dou a, b, c, d;
dou f(dou i)
{
//计算当前函数值
return a * i * i * i + b * i * i + c * i + d;
}
int main()
{
cin >> a >> b >> c >> d;
//实根只出现在 -100~100 之间,只需遍历这个区间
for (int i = -100; i < 100; i++)
{
//特殊情况特殊判断
if (f(i) == 0)
printf("%.2lf ", 1.0 * i);
//判断当前区间内是否存在实根
if (f(i) * f(i + 1) >= 0)
continue;
//二分精度
dou l = 1.0 * i, r = 1.0 * (i + 1), mid;
while (l + N <= r)
{
mid = (l + r) / 2.0;
if (f(mid) * f(r) <= 0)
l = mid;
else
r = mid;
}
printf("%.2lf ", mid);
}
return 0;
}
这里空空如也
有帮助,赞一个