糯米

TI DaVinci, gstreamer, ffmpeg
随笔 - 167, 文章 - 0, 评论 - 47, 引用 - 0
数据加载中……

POJ 1079 Ratio 分数操作

题目大意:
给出一个分数,比如1498/902。求出当分母分别为1, 2, ....的时候,最接近1498/902的分数。
比如:
当分母为1的时候,最接近1498/902的分数为 1/1。
当分母为2的时候,最接近1498/902的分数为 3/2。
当分母为3的时候,最接近1498/902的分数为 5/3。
。。。

思路:
不要用高精度哦,直接模拟分数的操作最好了。

#include <stdio.h>
#include 
<math.h>

struct frac {
    __int64 up, down;
}
;

__inline __int64 gcd(__int64 a, __int64 b)
{
    __int64 r;

    
if (a < b) {
        r 
= a;
        a 
= b;
        b 
= r;
    }


    
while (1{
        r 
= a % b;
        
if (!r)
            
return b;
        a 
= b;
        b 
= r;
    }

}


__inline 
struct frac frac_init(__int64 up, __int64 down)
{
    __int64 r, s;
    
struct frac f;

    r 
= up ? gcd(up, down) : 1;
    
if (r < 0)
        r 
= -r;
    f.up 
= up / r;
    f.down 
= down / r;
    
return f;
}


__inline 
struct frac frac_sub(struct frac fa, struct frac fb)
{
    
return frac_init(fa.up*fb.down-fa.down*fb.up, fa.down*fb.down);
}


__inline __int64 frac_cmp(
struct frac fa, struct frac fb)
{
    
return frac_sub(fa, fb).up;
}


__inline 
struct frac frac_abs(struct frac f)
{
    
if (f.up < 0)
        f.up 
= -f.up;
    
return f;
}


int main()
{
    __int64 up, down;
    
struct frac target, min_dis, f, dis;

    
while (scanf("%I64d%I64d"&up, &down) != EOF) {
        target 
= frac_init(up, down);
        min_dis.down 
= 1;
        min_dis.up 
= (__int64)1e15;
        
for (down = 1; down <= target.down; down++{
            up 
= (down*target.up)/target.down;
            
if (((down*target.up)%target.down)*2 >= target.down)
                up
++;
            f 
= frac_init(up, down);
            dis 
= frac_abs(frac_sub(f, target));
            
if (frac_cmp(dis, min_dis) < 0{
                printf(
"%I64d/%I64d\n", f.up, f.down);
                min_dis 
= dis;
            }

        }

        printf(
"\n");
    }


    
return 0;
}


 

posted on 2010-02-13 01:53 糯米 阅读(672) 评论(0)  编辑 收藏 引用 所属分类: POJ


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