分析:分数求和问题。 得分14/20,暂时想不出来哪种情况没有考虑到。。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef struct Node{
int fz, fm;
} node;
node a[ 110 ] ;
ll n, cur, ans1, ans2, flag1, flag2;
string s;
ll gcd ( ll a, ll b) { return b> 0 ? gcd ( b, a% b) : a; }
ll lcm ( ll a, ll b) { return a* b/ gcd ( a, b) ; }
int main ( ) {
std: : ios: : sync_with_stdio ( false) ;
cin>> n;
for ( int i= 0 ; i< n; i++ ) {
ans1= 0 ;
ans2= 0 ;
flag1= 1 ;
flag2= 1 ;
cin>> s;
for ( int j= 0 ; j< s. length ( ) ; j++ ) {
if ( s[ j] == '/' ) { cur= j; break ; }
if ( s[ j] == '-' ) { flag1= - 1 ; continue ; }
ans1= ans1* 10 + ( s[ j] - '0' ) ;
}
for ( int j= cur+ 1 ; j< s. length ( ) ; j++ ) {
ans2= ans2* 10 + ( s[ j] - '0' ) ;
}
a[ i] . fz= ans1* flag1;
a[ i] . fm= ans2;
}
ll res2= 1 ;
for ( int i= 0 ; i< n; i++ ) {
res2= lcm ( res2, a[ i] . fm) ;
}
ll ans= 0 ;
for ( int i= 0 ; i< n; i++ ) {
ll tmp= a[ i] . fz;
ans+ = tmp* res2/ a[ i] . fm;
}
ll f= 1 , q;
if ( ans< 0 ) { f= - 1 ; q= gcd ( - ans, res2) ; }
else { q= gcd ( ans, res2) ; }
ans= ans/ q;
res2= res2/ q;
ll zs= ans/ res2;
ll fs= ans% res2;
if ( zs!= 0 && fs!= 0 ) {
cout<< f* zs<< " " << f* fs<< "/" << res2<< endl;
}
else if ( zs!= 0 && fs== 0 ) {
cout<< f* zs<< endl;
}
else if ( zs== 0 && fs!= 0 ) {
cout<< fs<< "/" << f* res2<< endl;
}
else {
cout<< "0" << endl;
}
return 0 ;
}