ZOJ 2330 A^B == B^A?

菜题。即便是这样我还是写了三遍……步长开的太大,结果精度不高。

把A^B == B^A两边求对数,很容易得到ln(x)/x的函数。求导,此函数在e两侧单调。故可用二分。

 1/*
 2    二分逼近ln(x)/x = ln(a)/a
 3*/

 4
 5#include <cstdio>
 6#include <cmath>
 7
 8#define ZERO 1e-14
 9#define E exp(1.0f
10
11double A;
12
13int main ()
14{
15    //freopen ( "in.txt", "r", stdin );
16    while ( scanf ( "%lf"&A ) != EOF )
17    {
18        if ( A - E > ZERO )
19            printf ( "-1\n" );
20        else
21        {
22            double high, low, mid, d;
23            high = 45, low = E;
24            while ( high - low >= ZERO )
25            {
26                mid = ( high + low ) / 2;
27                d = log ( mid ) / mid - log ( A ) / A;
28                if ( d < ZERO && d > -ZERO )
29                    break;
30                else if ( d > ZERO )
31                {
32                    low = mid + 0.0000001;
33                }

34                else if ( d < -ZERO )
35                {
36                    high = mid - 0.0000001;
37                }

38            }

39            printf ( "%0.5f\n", mid );
40            d = fabs ( log ( mid ) / mid - log ( A ) / A );
41            //printf ( "error %0.8f\n", d );
42        }

43    }

44    return 0;
45}

posted on 2008-02-11 14:18 杜仲当归 阅读(587) 评论(0)  编辑 收藏 引用 所属分类: 搜索剪枝

只有注册用户登录后才能发表评论。

导航

<2008年2月>
272829303112
3456789
10111213141516
17181920212223
2425262728291
2345678

统计

常用链接

留言簿(1)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜