P1024 [NOIP2001 提高组] 一元三次方程求解
题目链接
题目思路
二分 :根据题意,两根乘积 < 0,两根之间必有根,并且两根之差 >= 1,所以以1为大区间,若两根乘积为负则二分寻找
暴力 :因为保留两位小数,则每次缩小区间0.01,直接寻找乘积为0的两根,其平均数的近似值即为根
题目代码
二分
#include <iostream>
#include <algorithm>
using namespace std;
double a, b, c, d;
double f(double x)
{
return a * x * x * x + b * x * x + c * x + d;
}
int main()
{
double x1, x2;
double l, r;
scanf("%lf%lf%lf%lf", &a, &b, &c, &d);
for(double i = -100; i < 100; i ++)
{
l = i, r = i + 1;
x1 = f(l), x2 = f(2);
if(x1 == 0) printf("%.2f ", l);
if(x1 * x2 < 0)
{
while(r - l >= 1e-3)
{
double mid = (l + r) / 2;
if(f(mid) * f(r) <= 0) l = mid;
else r = mid;
}
printf("%.2f ", r);
}
}
return 0;
}
暴力
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
double a, b, c, d;
scanf("%lf%lf%lf%lf", &a, &b, &c, &d);
for(double i = -100; i <= 100; i += 0.001)
{
double j = i + 0.001;
double ans1 = a * i * i * i + b * i * i + c * i + d;
double ans2 = a * j * j * j + b * j * j + c * j + d;
if(ans1 >= 0 && ans2 <= 0 || ans1 <= 0 && ans2 >= 0)
{
double x = (i + j) / 2;
printf("%.2f ", x);
}
}
return 0;
}
作者:vacilie
出处:https://www.cnblogs.com/vacilie/p/16041366.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律