第六届蓝桥杯大赛个人赛(软件类)校内选拔题目X^X=10

如果x的x次幂结果为10,你能计算出x的近似值吗?

显然,这个值是介于2和3之间的一个数字。

请把x的值计算到小数后6位(四舍五入),并填写这个小数值。

注意:只填写一个小数,不要写任何多余的符号或说明。

题上说的很明确,答案是介于2到3之间的,所以暴力枚举没问题

#include<iostream>
#include<cmath>
#include<iomanip>    
using namespace std;
int main()
{
    double x = 2.0;
    for(;x!=3.0;x+=0.00000001)//加的时候尽量位数放大
    {
        if(fabs(pow(x,x)-10) < 0.000001)//这里来限制范围
            {
                cout << fixed<<setprecision(6)<<x<<endl;
                //最后设置精度
                break;
            }
    }
    return 0;
}

但是这个程序就很慢,我在网上找了一个小哥的另外一种方法,这个就快很多

二分法

这个方法转载的地址http://blog.csdn.net/Tao_222/article/details/50760580

#include<iostream>  
#include<iomanip>  
#include<cmath>  
using namespace std;  

int main()  
{  
    long double a=2.0,b=3.0,c=1,aa,bb,cc=1.0;  
    while(fabs(cc)>1e-8)  
    {  
        c=(a+b)/2.0;  
        aa=pow(a,a)-10.0,bb=pow(b,b)-10.0,cc=pow(c,c)-10.0; 
        //通过aa,cc,cc的计算,可以将精度进一度提高
        //aa,bb和cc想成就可以知道最终结果的大致范围,因为结果越近,相乘就越接近于0,所以这个小哥用0来判断 
        if(aa*cc<0) b=c;  
        else if(bb*cc<0) a=c;  
        cc=pow(c,c)-10.0;  
    }  
    cout<<fixed<<setprecision(6)<<c<<endl;  
}  

猜你喜欢

转载自blog.csdn.net/m0_37787222/article/details/79450457