江西财经大学第一届程序设计竞赛 F

链接:https://www.nowcoder.com/acm/contest/115/F
来源:牛客网

题目描述

对于方程 2018 * x ^ 4 + 21 * x + 5 * x ^ 3 + 5 * x ^ 2 + 14 = Y,
告诉你Y的值,你能找出方程在0~100之间的解吗?

输入描述:

第一行输入一个正整数T(表示样例个数)
接下来T组样例
每组样例一行,输入一个实数Y

输出描述:

一行输出一个样例对应的结果,
输出方程在0~100之间的解,保留小数点后4位小数;如果不存在,输出 -1
示例1

输入

2
1
20180421

输出

-1
9.9993
牛顿表示迭代法和二分都可以哦
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int debug_num=0;

const double eps=1e-6;

double y;

double f(double x)
{
    return (2018*x*x*x*x+5*x*x*x+5*x*x+21*x+14-y);
}

int main()
{

    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lf",&y);
        int flag=0;
        for(double ans=0;ans<=100-0.5;ans=ans+0.5){
            if(f(ans)*f(ans+0.5)>0) continue;
            double l=ans-0.5,r=ans+0.5;
            if(r>l){
                while(r-l>eps)
                {
                    double mid=(l+r)/2;
                    if(f(mid)>=0) r=mid;
                    else l=mid;
                }
            }
            else{
                while(l-r>eps)
                {
                    double mid=(l+r)/2;
                    if(f(mid)<=0) r=mid;
                    else l=mid;
                }
            }
            if(r>=0&&r<=100){
                printf("%.4f
",r);
                flag=1;
                break;
            }
        }
        if(!flag) printf("-1
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/yinghualuowu/p/8904134.html