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 ; }
相关文章推荐
- 分数加减法 poj 3979
- POJ-3979-分数加减法(分数运算)
- POJ 3979 分数加减法(水~)
- POJ3979 分数加减法
- POJ 3979 分数加减法
- poj 3979 分数加减法
- POJ 3979 分数加减法 中文
- poj 3979 分数加减法
- poj 3979 分数加减法
- POJ 3979 分数加减法(水题)
- (POJ 3979)分数加减法
- poj 3979 分数加减法
- poj3979 分数加减法
- poj 3979 分数加减法
- ACM: 水题 分数运算 poj 3979
- poj3979——分数化简
- pku--3979 分数加减法(注意分子为0,分母为1的情况)
- 3979 分数加减法
- NYOJ 111 分数加减法
- NYOJ 111 分数加减法