您的位置:首页 > 其它

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 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: