题目意思不用多说。
但是要注意到一句话:输入的是a和b中较小的那个,如果没有这句话的话就又是另一种做法了
我们可以对方程两边同时取对数,从而得到:ln(a)/a=ln(b)/b
移一下项得到f(x)=ln(a)/a-ln(b)/b
我们的目的是让f(x)=0,所以很容易让人联想到二分算法。
那么首先我们需要证明函数单调性。
我们可以假设输入的数据是a,而需要求的是b=x
于是f(x)=ln(a)/a-ln(x)/x
求导可以计算得到,当x=e的时候f(x)有最小值。
而且f(x)与x轴的两个交点就是所谓的可行解a和b
那么我们很显然的可以得到a和b分列于e的两边。
既然a是较小的那个,那么必然有a<e
故,当a已经大于了e就必然无解,这个时候输出-1
反之一定有解。
于是可以二分计算出答案。
注意到x>e的那个部分是单调递增的。
我的代码:
#include<stdio.h>#include<math.h>#define e 2.7182818284590452353602874713527double a;double f(double x){double temp1,temp2;temp1=log(a)/a;temp2=log(x)/x;return temp1-temp2;}int main(){int i;double right,left,mid;while(scanf("%lf",&a)!=EOF){if(a>=e){printf("-1/n");continue;}left=e,right=100;for(i=0;i<1000;i++){mid=(left+right)/2.0;if(f(mid)<=0)left=mid;elseright=mid;}printf("%.5lf/n",mid);}return 0;}