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

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

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

对于方程 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
函数是递增的
二分的模板题,每次把区间一分为二,就是mid=(l+r)*1.0/2;然后算f(mid),如果刚好等于Y就输出,如果小于就取右边的区间继续算,否则取左边的
区间继续算。
#include<stdio.h>
#include<string.h>
double Y;
int t;
double f(double x)
{
    return 2018*x*x*x*x + 21*x + 5*x*x*x + 5*x*x +14;//求导发现是递增的 
}
double find(int a,int b)
{
    double l=a;
    double r=b;
    if(f(0)>Y||f(100)<Y)//判断是否 无解 
    return -1;
    while(r-l>0.00001)//误差小于0.0001,我多加一个0没多大影响,还更精确 
    {
        double mid=(l+r)/2;
        if(f(mid)<Y)
        l=mid;
        else if(f(mid)>Y)
        r=mid;
        else return mid;
    }
    return l;
}
int main()
{
    scanf("%lld",&t);
    while(t--)
    {
        scanf("%lfd",&Y);
        double ans=find(0,100);
        if(ans==-1)
        printf("%.0f
",ans);
        else
        printf("%.4f
",ans);
    }
    return 0;
}


原文地址:https://www.cnblogs.com/6262369sss/p/8907345.html