C4top-N個數求和 (分數求和模擬)
阿新 • • 發佈:2019-01-28
#include<bits/stdc++.h> using namespace std; #define INF 0xfffffff #define MAXN 1100 struct Node { long long x,y;//分子分母 } a[MAXN]; long long gcd(long long a,long long b)//最大公約數 { return (a%b!=0?(gcd(b,a%b)):b); } long long lcm(long long a,long long b)//最小公倍數 { long long t=gcd(a,b); return (a*b/t); } int main() { #ifdef ONLINE_JUDGE #else freopen("G:/cbx/read.txt","r",stdin); //freopen("G:/cbx/out.txt","w",stdout); #endif ios::sync_with_stdio(false); cin.tie(0); long long n; cin>>n; for(long long i=0; i<n; ++i) { char str[10]; cin>>str; long long len=strlen(str); a[i].x=a[i].y=0; long long minu=1;//是否負數 bool flag=true; for(long long j=0; j<len; ++j) { if(str[j]=='-') { minu=-1; continue; } if(str[j]=='/') { flag=false; continue; } if(flag) { a[i].x*=10; a[i].x+=str[j]-'0'; } else { a[i].y*=10; a[i].y+=str[j]-'0'; } } if(minu==-1) a[i].x*=minu;//負數 //cout<<a[i].x<<"/"<<a[i].y<<endl; long long t=gcd(a[i].x,a[i].y); if(t!=1) a[i].x/=t,a[i].y/=t; } long long fz=0,fm=0;//分子分母 if(n==1)//①只有一組資料 { fz=a[0].x,fm=a[0].y; } else { fm=lcm(a[0].y,a[1].y); for(long long i=1; i<n; ++i) { long long t=lcm(fm,a[i].y); fm=t; } //cout<<lc<<endl; fz=0;//分子 for(long long i=0; i<n; ++i) { long long t=fm/a[i].y; a[i].y*=t; a[i].x*=t; fz+=a[i].x; //cout<<a[i].x<<"/"<<a[i].y<<endl; } } if(fz==0)//②分子為0,結果為0 { cout<<"0"<<endl; } else { long long ans=fz/fm; //cout<<ans<<endl; if(ans)//③假分數 { fz-=ans*fm; if(fz==0) { cout<<ans<<endl; } else { long long t=gcd(fz,fm); fz/=t,fm/=t; cout<<ans<<" "<<fz<<"/"<<fm<<endl; } } else//④真分數 { long long t=gcd(fz,fm); fz/=t,fm/=t; cout<<fz<<"/"<<fm<<endl; } } return 0; }