ZOJ2330

 /*
*     WA得相當鬱悶,就是因爲懷疑double有精度問題~
*     經過經驗,似乎double在處理6位以下的精度是不會有問題的
*     直接二分能過的
*     考慮精度應該在強制類型轉換的時候做
*/
#include <stdio.h>
#include 
<math.h>

#define MAX 44.0
#define e exp(1.0f) 
#define lowest 1e-6
double a, mid ;

void work()
{
    
double low = e ;
    
double up = MAX ;
    
double x, y = a/log(a) ;
    
while ( low <= up ) {
        mid 
= (low+up)/2 ;
        x 
= mid/log(mid) ;
        
if ( x == y ) return ;
        
if ( x < y ) {
            low 
= mid+0.000001 ;
        }

        
else if ( x > y ) 
            up 
= mid-0.000001 ;
        
/*else if ( fabs(x-y)<lowest ) {
            return ;
        }
*/

    }

}

int main ( void )
{
    
while ( 1 == scanf ( "%lf"&a ) ) {
        
if ( a > e ) {
            printf ( 
"-1 " ) ;
            
continue ;
        }

        work() ;
        printf ( 
"%.5lf ", mid ) ;
    }

    
return 0 ;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章