P1024 [NOIP2001 提高组] 一元三次方程求解
题解:P1024 [NOIP2001 提高组] 一元三次方程求解
暴力枚举。
因为本题约定该方程存在三个不同实根(根的范围在 \(-100\) 至 \(100\) 之间),且根与根之差的绝对值 \(\ge 1\)。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后 \(2\) 位。
即使我们令 \(i\) 每次增加 \(0.001\),循环才进行了 \(\frac{200}{0.001}=2 \times 10^5\) 次,显然不会超过时间限制。
因此我们从 \(-100\) 到 \(100\) 来枚举 \(i\),如果结果十分接近 \(0\)(代码中写的 \(10^{-5}\))就保留两位小数输出即可。
#include<bits/stdc++.h>
using namespace std;
double a,b,c,d;
int main(){
cin>>a>>b>>c>>d;
for(double i=-100;i<=100;i+=0.001){
if(fabs(i*i*i*a+i*i*b+i*c+d)<0.0001)
cout<<fixed<<setprecision(2)<<i<<" ";
}
return 0;
}
其中 fabs
是 C++ 中求一个浮点数的绝对值函数,而 cout<<fixed<<setprecision(2)<<i<<" "
则是保留两位数输出的函数。
这道题的其他解法还很多,例如盛金公式、卡尔丹公式、牛顿迭代法等。但是暴力枚举就足够了。