题目
分析
这道题目对数学知识的要求不高,只要了解一点:
对于任何连续的函数,如果\(f(x_1)\times f(x_2)\lt 0\),那么在这个区间中一定存在\(f(x)=0\)的一个根。
再仔细看题目:
约定该方程存在三个不同实根(根的范围在−100至100之间),且根与根之差的绝对值≥1。
那么可以保证的是,在一个跨度为1
的区间里,最多只有一个根。
那么我们可以将整个可能的区间分成若干个跨度为1
的区间,然后用上述的数学知识来判断是否存在根。这个判断过程就是典型的二分法。
if (f(left, a, b, c, d) * f(right, a, b, c, d) > 0)
{
continue; // 如果没有根,跳过该区间
}
// 在当前小区间内使用二分法找到一个根
double mid;
while (right - left > 1e-6)
{ // 精度控制到 1e-6
mid = (left + right) / 2;
if (f(left, a, b, c, d) * f(mid, a, b, c, d) <= 0)
{
right = mid; // 根在 [left, mid]
}
else
{
left = mid; // 根在 [mid, right]
}
}
// 找到一个根,存储并继续查找下一个根
roots[root_count++] = (left + right) / 2;
答案
思考
针对浮点数的比较,我再强调一下:由于浮点数的“不精确性”,永远不要试图比较两个浮点数完全相等,而是应该用程序中的方式:\(|a-b|\lt eps\)就可以了,而这里的\(eps\)是一个根据题目精度要求而定的一个所谓“无穷小量”。