• 方程求解


    【NOIP2001T】方程求解

    问题描述

    有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程。

    输入格式
      给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1。

    输出格式
      要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。

    样例输入

    1 -5 -4 20

    样例输出

    -2.00 2.00 5.00

    提示

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

    思索与实现:

    根据提示,找到两个点乘积 < 0,那么答案锁定在此区间之内,然后两分查找即可。注意精度上当l与r足够小就可以算是出解了。

    Code:

    #include<bits/stdc++.h>
    #define D double
    
    using namespace std;
    
    D a, b ,c ,d, js = 0;
    
    D f(D x){
    	return x * x * x * a + x * x * b + x * c + d;
    }
    
    void div(D l, D r){
    	if (r - l <= 0.00001){
    		printf("%.2lf ",l);
    		return;
    	}
    	D mid = (l + r) / 2;
    	if (f(l) * f(mid) < 0)
    		div(l, mid);
    	else div(mid, r);
    }
    
    int main(){
    	freopen("equation.in","r",stdin);
    	freopen("equation.out","w",stdout);
    	cin >> a >> b >> c >> d;
    	for (D i = -100; i <= 100; i++) {
    		if (!f(i)) printf("%.2lf ",i); 
    		if (f(i) * f(i + 1) < 0)
    			div(i, i + 1);
    	}
    	return 0;
    }
    
  • 相关阅读:
    RramSim2
    DiskSim
    FTL2
    Durable NAND flash memory management
    node系列:全局与本地
    CSS系列:less备忘
    Sql Server 2008:调试
    JavaScript系列:再巩固-原型链
    移动端 :meta标签1万个作用
    Asp.Net:Repeater 详情 备用
  • 原文地址:https://www.cnblogs.com/sun915/p/9615153.html
Copyright © 2020-2023  润新知