版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/A7_RIPPER/article/details/84791542
题目大意:
计算n个分数的总和,输出形式为:整数部分 分数部分。其中分数部分要最简形式。
解题思路;
代码如下:
#include<iostream> #include<cstdio> #include<fstream> #include<set> #include<cmath> #include<cstring> #include<string> #include<map> #include<vector> #include<iomanip> #include<cstdlib> #include<list> #include<queue> #include<stack> #include<algorithm> #define inf 0x3f3f3f3f #define MOD 1000000007 #define mem0(a) memset(a,0,sizeof(a)) #define mem1(a) memset(a,-1,sizeof(a)) #define meminf(a) memset(a,inf,sizeof(a)) //vector ::iterator it; //set<int>::iterator iter; typedef long long ll; typedef unsigned long long ull; using namespace std; ll fun(ll a,ll b) { //cout<<a<<' '<<b<<'*'; while(b) { ll t=b; b=a%b; a=t; } // cout<<a<<endl; return a; } int main() { ll numerator[110]={0},denominator[110]={0},n; for(int i=0;i<110;i++)denominator[i]=1; cin>>n; for(int i=0;i<n;i++) { scanf("%lld/%lld",&numerator[i],&denominator[i]); } // sort(denominator,denominator+n); ll bei=denominator[1]*denominator[0]/fun(max(denominator[1],denominator[0]),min(denominator[1],denominator[0]));//先得到前两个分母的最小公倍数 //cout<<bei<<endl; for(int i=2;i<n;i++) { bei=denominator[i]*bei/fun(max(denominator[i],bei),min(denominator[i],bei));//依次 // cout<<bei<<endl;递推得到所有分母的最小公倍数 } ll sum=0; for(int i=0;i<n;i++) { ll k=bei/denominator[i];//通分 sum+=k*numerator[i];//计算分子和 //cout<<sum<<'*'<<k*numerator[i]<<endl; } //cout<<sum<<' '<<bei<<endl; ll inter=sum/bei,mmo=fabs(sum%bei);//取整数和余数部分 bool flag=false;//对于整数和分数部分存在0情况的标记 if(inter) { cout<<inter; flag=true; } ll p=fun(max(mmo,bei),min(mmo,bei)); //p=fabs(p); mmo=mmo/p;bei=bei/p; if(mmo) { if(inter)cout<<' '; cout<<mmo<<'/'<<bei; flag=true; } if(!flag)cout<<0; cout<<endl; // std::ios::sync_with_stdio(false); // cin.tie(0); // freopen("test.txt","r",stdin); // freopen("output.txt","w",stdout); return 0; }
文章来源: 1081 Rational Sum