• 江西财经大学第一届程序设计竞赛 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;
    }


  • 相关阅读:
    3.1 history跳转页面产生跨域问题
    2021年6月7日 团队冲刺第二阶段04
    2021年6月6日 团队冲刺第二阶段03
    2021年6月5日 团队冲刺第二阶段02
    2021年6月4日 团队冲刺第二阶段01
    2021年6月3日
    2021年6月2日
    2021年6月1日
    2021年5月31日
    2021年5月30日
  • 原文地址:https://www.cnblogs.com/6262369sss/p/8907345.html
Copyright © 2020-2023  润新知