[NOIP提高&洛谷P1024]一元三次方程求解

Description

有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。

提示:记方程f(x)=0,若存在2个数x1和x2,且x1<x2,f(x1)*f(x2)<0,则在(x1,x2)之间一定有一个根。

输入格式:一行,4个实数A,B,C,D。

输出格式:一行,三个实根,并精确到小数点后2位。

Solution

1.考虑valid函数的写法,因为无法简单的解一元三次方程,我们不妨把方程看做函数f(x),对于自变量x,返回其对应的f(x),即:

double valid(double x){
double num=x*x*x*a+x*x*b+x*c+d;
return num;
}

2.考虑因为根与根之差的绝对值>=1,在同一个宽度为1的区间内不会存在两个根,所以可以枚举-100~100之间的每一个宽度为1的区间,对每个区间进行二分;

3.对于每一个区间[L,L+1)首先判断根是否在1其中,根据零点的存在性定理,当 valid(l)* valid(l+1)≤ 0时,零点才存在于这个区间;

4.如果存在,首先检验l是否为解,若不是,二分区间,直至左右端点差值满足精度要求为止;

5.注意:因为我们枚举的是区间[L,L+1),所以100没有被检验过,最后记得检验100是否为根;

Code

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std; int i,j,k;
double l,r,mid,a,b,c,d; double valid(double x){
double num=x*x*x*a+x*x*b+x*c+d;
return num;
} int main(){
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
for(i=-100;i<100;++i)
if(valid(i)==0)printf("%.2lf ",(double)i);
else if(valid(i)*valid(i+1)<0){
l=i;r=l+1;
while(r-l>=0.001){
mid=(l+r)/2;
if(valid(l)*valid(mid)<=0)r=mid;
else l=mid;
}
printf("%.2lf ",l);
}
if(valid(100)==0)printf("100.00");
printf("\n");
return 0;
}

二分答案的基础参考以前的随笔:http://www.cnblogs.com/COLIN-LIGHTNING/p/8543330.html

[NOIP提高&洛谷P1024]一元三次方程求解 题解(二分答案)的更多相关文章

  1. 洛谷 [P1024]一元三次方程求解【二分答案】

    题目链接:https://www.luogu.org/problemnew/show/P1024 题目描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b ...

  2. 洛谷——P1024 一元三次方程求解

    P1024 一元三次方程求解 题目描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-10 ...

  3. 洛谷P1024 一元三次方程求解

    P1024 一元三次方程求解 题目描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-10 ...

  4. [NOIP2001] 提高组 洛谷P1024 一元三次方程求解

    题目描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差 ...

  5. 【洛谷P1024一元三次方程求解】

    题目描述 有形如: ax3 + bx2 + cx1 + dx0 = 0 这样的一个一元三次方程.给出该方程中各项的系数( a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在 -100 ...

  6. 洛谷 [P1024]一元三次方程求解

    一道水题然而坑点很多. #include <iostream> #include <cstdio> #include <algorithm> #include &l ...

  7. 洛谷P1024 一元三次方程求解(数学)

    题意 题目链接 Sol 本来是一道好的公式题. 然后输出只要保留两位小数?? 直接上不就赢了嘛.. #include<bits/stdc++.h> #define LL long long ...

  8. P1024 一元三次方程求解(二分答案)

    思路: 求这个根,然后有一个关键的条件|x1-x2|>=1,然后就是从-100,枚举到+100,每次二分(i, i+1)注意如果f(i)*f(i+1)>0则不进行二分,如果,你觉得这样的值 ...

  9. P1024 一元三次方程求解

    P1024 一元三次方程求解 #include<cstdio> #include<iostream> #include<algorithm> using names ...

随机推荐

  1. “四则运算生成程序——GUI支持和部分功能改进”链接

    项目成员:张金生     张政 <正文随笔发布在张金生博客中> 四则运算生成程序——GUI支持和部分功能改进

  2. Robot Framework 教程 (7) - 使用For循环

    在自动化测试过程中,使用For循环来对某个动作进行重复操作是很普遍的行为.在Robot Framework中,各种测试库中均提供了多种方式的For循环结构,在其中覆盖了大部分类型的循环类型.而Robo ...

  3. SpringMVC 之 mvc:exclude-mapping 不拦截某个请求

    在使用 SpringMVC 是,配置了一个 Session 拦截器,用于拦截用户是否登录,但是用户访问登录页面和注册页面时就不需要拦截了,这时就需要用到这个标签了 <mvc:execlude-m ...

  4. 配置SSH Forward提升安全性

    目标 MacBook ---(SSH)---> BastionServer ---(SSH)---> RemoteServer   说明 BastionServer.RemoteServe ...

  5. BZOJ5302 HAOI2018奇怪的背包(动态规划)

    由裴蜀定理,子集S有解当且仅当gcd(S,P)|w. 一个显然的dp是设f[i][j]为前i个数gcd为j的选取方案.注意到这里的gcd一定是P的约数,所以状态数是n√P的.然后可以通过这个得到gcd ...

  6. 【BZOJ2989】数列(二进制分组,主席树)

    [BZOJ2989]数列(二进制分组,主席树) 题面 BZOJ 权限题啊... Description 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即g ...

  7. POJ 2155 Matrix (矩形)

    date:公元2017年7月19日适逢周三: location:清北集训 杭州 point:二维树状数组/二维差分 Matrix Time Limit: 3000MS   Memory Limit:  ...

  8. 【转】vi编辑只读文档无法保存的解决办法

    vi编辑只读文档无法保存的解决办法 使用普通用户编辑nginx.conf 等配置文件: 保存的时 候会提示:没有Root Permission 可以用如下方法解决:保存时加上::w !sudo tee ...

  9. 【Cf #449 C】Willem, Chtholly and Seniorious(set维护线段)

    这里介绍以个小$trick$,民间流传为$Old Driver Tree$,实质上就是$set$维护线段. 我们将所有连续一段权值相同的序列合并成一条线段,扔到$set$里去,于是$set$里的所有线 ...

  10. 【SDOI2015】序列统计 解题报告

    2119: [BZOJ3992][SDOI2015]序列统计 Description 小\(C\)有一个集合\(S\),里面的元素都是小于\(M\)的非负整数. 他用程序编写了一个数列生成器,可以生成 ...