1081. Rational Sum
2015-08-19 16:57
344 查看
#include <cstdio> #include <vector> #include <string> #include <iostream> #include <sstream> using namespace std; #define MAX 20 typedef struct D { int num ; int dem ; int exp ; int sig ; }D ; //求最大公约数 int gcd(int a , int b ) { return b==0 ? a : gcd( b , a%b); } //进行约分 D getSimple(D d) { int temp = gcd(d.num , d.dem ) ; d.num = d.num / temp ; d.dem = d.dem / temp; return d ; } D getSum( D a , D b ) { int temp = gcd( a.dem , b.dem ) ; //printf("%d %d || %d %d\n" , a.num , a.dem , b.num , b.dem); //最小公倍数 int bcd = a.dem * b.dem / temp ; D ans ; a.num = bcd / a.dem * a.num ; b.num = bcd / b.dem * b.num ; ans.dem = bcd ; if( a.sig == 1 && b.sig == 1) { ans.sig = 1 ; ans.num = a.num + b.num ; } else if( a.sig == 1 && b.sig == -1 ) { ans.num = a.num - b.num ; if( ans.num < 0 ) { ans.num = - ans.num ; ans.sig = -1 ; } else { ans.sig = 1 ; } } else if( a.sig == -1 && b.sig == 1 ) { ans.num = b.num - a.num ; if(ans.num < 0 ) { ans.num = - ans.num ; ans.sig = -1 ; } else { ans.sig = 1 ; } } else { ans.num = a.num + b.num ; ans.sig = -1 ; } ans = getSimple(ans) ; return ans ; } int main(void) { int N ; D value ; value.dem = 1 ; value.num = 0 ; value.sig = 1 ; freopen("input.txt" , "r" , stdin); scanf("%d" , &N); while(N--) { string tempS ; int index ; stringstream ss ; D d ; cin>> tempS ; index = tempS.find('/'); if( tempS[0] == '-') { ss << tempS.substr( 1 , index - 1 ) ; ss >> d.num ; ss.clear(); ss << tempS.substr( index + 1 , tempS.length() - index - 1) ; ss >> d.dem ; d.sig = -1 ; } else { ss << tempS.substr( 0 , index ) ; ss >> d.num ; ss.clear() ; ss << tempS.substr( index + 1 , tempS.length() - index - 1 ) ; ss >> d.dem ; d.sig = 1 ; } d = getSimple( d ) ; value = getSum( value , d) ; } if( value.sig == -1 ) printf("-"); if( value.num > value.dem ) { value.exp = value.num / value.dem ; value.num = value.num % value.dem ; if( value.num != 0 ) printf("%d %d/%d\n" , value.exp , value.num , value.dem); else { printf("%d\n" , value.exp); } } else if( value.num == value.dem ) { printf("%d\n" , value.num / value.dem); } else { printf("%d/%d\n" , value.num , value.dem); } return 0 ; }
相关文章推荐
- js只需5分钟创建一个跨三大平台纯原生APP
- WCF通过IIS寄宿服务
- 桌面支持--outlook会议邀请(选择可选参加的领导)
- 第三方登入和分享
- 能力风暴机器人AS-MF2011循迹算法
- php02
- App 从Windows到OS X的移植
- 使用确定对话框来控制循环
- select @@identity
- Duilib界面库Capture系列的相关bug解决
- HTML
- nmap使用参考
- 1094. The Largest Generation
- 邻接表(数组实现)
- Android内存泄漏研究
- matlab中如何保留指定的变量的数据
- POJ 2342 &&HDU 1520 Anniversary party 树形DP 水题
- js原生实现FastClick事件
- 每天进步一点点——load data infile的相关优化
- Centos下配置DNS允许访问谷歌网站(shell脚本实现)