1001—Can you solve this equation?

1.题目序号:1001—Can you solve this equation?
2.题意:先输入n,再输入n个y,找出方程8*x^4 + 7*x^3 + 2*x^2 + 3*x + 6 == y的解,x在0到100之间,保留4位小数。
3.思路:二分查找,一直取中间数。首先判断输入的数y是否在y(0)到y(100)之间,不在这个范围直接输出“No solution!”;否则用最大上限减去最低下限是否小于1e-8,如果大于1e-8,就取中间数判断大小,例如,才开始的时候,最大上限是high=100,最低下限是low=0,取0,100的中间数mid=(h+l)/2=50,将50带入方程比较,缩小high与low的范围,直到high与low在1e-8的范围内。
4.感想:这道题保留四位小数,原本以为取精度到1e-6就行,但是测试100,输出1.6151,标准答案是1.6152,所以不可以,最后去了1e-8,才正确。
最重要是的,这次做题把continue跟break分清楚了,第一次wa就是直接break,输入两个数测试虽然正确,但是提交就不对了,应该用continue,继续进行下一次循环,基础要牢固。
5.AC代码:
#include <iostream>  
#include <stdio.h>  
#include <cmath>  
using namespace std;  
  
double equ(double x)  
{  
    return 8*pow(x,4)+7*pow(x,3)+2*x*x+x*3+6;  
}  
  
int main()  
{  
    int n;  
    double y;  
    cin>>n;  
    for(int i=0;i<n;i++)  
    {  
        double l=0,h=100,mid,co;  
        cin>>y;  
        if(y<equ(0)||y>equ(100))  
        {  
           cout<<"No solution!"<<endl;  
            continue;  
        }  
        else  
        {  
            while(h-l>1e-8)  
            {  
                mid=(h+l)/2;  
                if(equ(mid)<y)  
                    {l=mid;}  
                 else if(equ(mid)>y)  
                    {h=mid;}  
                else {l=mid;h=mid;}  
            }  
                printf("%.4lf\n",(h+l)/2);  
        }  
    }  
    return 0;  
}  



  

你可能感兴趣的:(1001—Can you solve this equation?)