您的位置:首页 > 其它

POJ 3979 分数加减法

2013-09-07 21:40 288 查看
简单模拟。。。细心就好了。。至于约分问题,我用的是欧几里得算法,两个数的最大公倍数为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 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: