Codeforces Round #172 (Div. 2) B. Nearest Fraction

题意:给出x,y ,n ,然后求最近与x/y的a/b,b的值要小于n。如果有相同的分数,输出分母最小的那个,如果分母相同,输出分支最小的那个。

解题过程:如果y<=n,就x/y约分输出,这里要注意约分,就因为忘了约分,WA了一次。。。如果y>n,则从1~n依次求值。因为已知x/y,确定了b的值,a = (x/y)*b,a取整,然后和x/y比较,找最小就行了。

代码:

View Code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <queue>
#include <math.h>
#include <map>
#include <vector>
#include <stack>
#define  N 1005
#define  INF 100000000
using namespace std ;

double cal( int a , int b )
{
    double t = ( 1.0 * a ) / ( 1.0 * b );
    return t ;
}

int gcd( int a , int b )
{
    if ( b == 0 )
    return a ;
    else
    return gcd( b , a % b ) ;
}

int main()
{
    double x , y ;
    double s , t , a ;
    double ans ;
    int min_a , min_b ,  n , i ;

    while( cin>>x>>y>>n )
    {
        if ( y < n )
        {
            int temp = gcd( x , y ) ;
            //cout<<temp<<endl ;
            printf ( "%d/%d\n" , ( int )x/temp , ( int )y/temp ) ;
        }
        else
        {
            s = x / y ;
            ans = INF ;
            for ( i = 1 ; i <= n ; i++ )
            {
               t = s * i ;
               a = cal( t , i ) ;
               if ( fabs( a - s ) < ans )
               {
                   min_a = ( int ) t ;
                   min_b = i ;
                   ans = fabs( a - s ) ;
               }
               a = cal( t + 1.0 , i ) ;
               if ( fabs ( a - s ) < ans )
               {
                   min_a = ( int )( t + 1.0 );
                   min_b = i ;
                   ans = fabs( a - s ) ;
               }
            }
            int temp = gcd( min_a , min_b ) ;
            printf ( "%d/%d\n" , min_a/temp , min_b/temp ) ;
        }
    }
    return 0 ;
}

 

posted @ 2013-03-11 20:36  Misty_1  阅读(303)  评论(0编辑  收藏  举报