POJ 3979 分数加减法

简单模拟。。。细心就好了。。至于约分问题,我用的是欧几里得算法,两个数的最大公倍数为1即不能再约分,还有就是注意卡精度。。



//192K 0MS
#include <stdio.h>
#include <math.h>
#define DEBUG "HERE"
#define bool char
#define true 1
#define false 0
#define MIN(X,Y) ((X<Y)?(X):(Y))
char ope ;
double up1,down1 ,up2,down2 ;
double ans ;

void Calculate ( )
{

    double num1 ,num2 ;
    num1 = up1 / down1 ;
    num2 = up2 / down2 ;
    switch ( ope )
    {
    case '+':
        ans = num1 + num2 ;
        break ;
    case '-':
        ans = num1 - num2 ;
        break ;
    }
}   

int gcd ( int a , int b )       //欧几里得算法
{
    return a % b ? gcd ( b , a % b ) : b ;
}

bool If_Correct ( double up , double down )
{
    int mcm   ;              //最大公约数 
    mcm = gcd ( up , down ) ;
    int flag ;
    flag = 0 ;
    if ( 1 == mcm || -1 == mcm )            //若最大公约数为1或-1则表示 分子与分母不能约分 
    {
        flag = 1 ;
    }
    return 1 == flag ? true : false ;
}

void Express_The_Answer (  )
{
    if ( ceil(ans) == floor (ans) )         //若结果是整数,直接输出
    {
        printf ("%.0f\n" ,ans ) ;
        return ;
    }
    else
    {
        double temp_up , temp_down ;            // temp_up 代表分子,temp_down代表分母 
        for ( temp_up = 153 ; temp_up >= 1 ; temp_up -- )  // 9/8 + 8/9
        {
            for ( temp_down = 72 ;temp_down >= 1 ; temp_down -- )
            {
                double resu ;
                resu = temp_up / temp_down ;            
                if ( fabs(ans-resu) < 1e-9  )           //卡精度,否则像2/7+5/3是过不了的 ,下同
                {
                    if ( If_Correct ( temp_up , temp_down ) )
                    {
                        printf ("%.0f/%.0f\n" , temp_up , temp_down ) ;
                        return ;
                    }
                }
                else if ( fabs(ans+resu) < 1e-9 )
                {
                    if ( If_Correct ( -temp_up , temp_down ) )
                    {
                        printf ("%.0f/%.0f\n" , -temp_up , temp_down ) ;
                        return ;
                    }
                }
            }
        }
    }
}


int
main ( )
{

    while ( EOF != scanf("%lf/%lf%c%lf/%lf" , &up1,&down1,&ope , &up2,&down2) )
    {
        Calculate ( ) ;
        Express_The_Answer ( ) ;
    }
    return 0 ;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值