随笔-72  评论-126  文章-0  trackbacks-0
http://acm.hdu.edu.cn/showproblem.php?pid=2675

#include<stdio.h>
#include
<math.h>
#define e 2.7182818284
double a;
int main()
{
    
double y,x,start,end,mid;
    
while(scanf("%lf",&y)==1)
    {
        a 
= y*e;
        start 
=1;
        end 
= e;
        
if((pow(start,a)-pow(a,start))*(pow(end,a)-pow(a,end))<0)
        {
            
while(1)
            {
                mid 
= (start+end)/2;
                x 
= pow(mid,a)-pow(a,mid);
                
if(end-start<0.0000001)
                    
break;
                
if(x>0)
                    end 
= mid;
                
else
                    start 
= mid;
            }
            
if(mid<a)
                printf(
"%.5lf %.5lf\n",mid,a);
            
else
                printf(
"%.5lf %.5lf\n",a,mid);
        }
        
else
            printf(
"%.5lf\n",a);
    }
    
return 0;
}


求导知道是函数递增的。。
x^ey=(ey)^x

两边ln可以得到
ln(x)
/= ln(ey)/ey
右边是一个常数。
设f(x) 
= ln(x)/x
求导得到 (
1-ln(x))/x^2
在(
0,e)是增函数,(e,∞)是减函数
f(
0)=0
f(e)
=1/e
可得到大致的函数图像如下:

因为y
>1 所以ln(ey)/ey的范围在0到1/e之间
然后就可以知道另外一个解的范围是(
1,e)
(画的很挫的图)
接下来就是赤裸裸的二分求解。。
又学习了。。
posted on 2009-03-09 21:09 shǎ崽 阅读(349) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理