您的位置:首页 > 其它

天梯赛模拟题_(N个分数的求和)

2018-03-17 11:46 162 查看
这题在赛场时,考虑到了得先整体再局部。是要将所有的分数的分母进行通同分。求出它们的最小公倍数。然后每个分数化为以最小公倍数为分母的分数 。分子部分累加起来。例如:1/3+1/2 = 5/6;(分子部分累加为5); 
(注意:所有分子和分母都在长整型范围内)。但还是没AC出来。现在把它解决后完整的贴出来。欸,真的是一道水题,分值还有15'。
因为题目要求是要将最终结果化为 整形: 最简分数型。
最大公约数:long long min_Divisor(int a,int b){ //最大公约数
swap(a,b);
while(a){
int c = a;
a = b%a;
b = c;
}
return b;
} 化简函数:void simplification(long long a,long long b){ //对分数化简
int flag = min_Divisor(a,b);
fenzhi = a/flag;
fenmu = b/flag;
}完整代码:
/*
@天梯赛_N个分数相加
*/
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
void swap(long long a,long long b){  //保证分母大于分子
if(a>b){
long long item = a;
a = b;
b = item;
}
else{
;
}
}
long  long min_Divisor(int a,int b){  //最大公约数
swap(a,b);
while(a){
int c = a;
a = b%a;
b = c;
}
return b;
}
int fenzhi = 0,fenmu = 0;                        //全局变量记录最终的分数部分
void  simplification(long long a,long long b){  //对分数化简
int flag = min_Divisor(a,b);
fenzhi = a/flag;
fenmu  = b/flag;
}
int main(){
int n;
cin>>n;
long long x,y;
char z;
long long s[1000] = {0},S[1000] = {0};     //s记录分子的值,S记录分母的值
long long t = 1;
int k = 0,K = 0;
for(int i = 0;i<n;i++){
cin>>x>>z>>y;
s[k++] = x;
S[K++] = y;
t = t*y/min_Divisor(t,y);          //求出所有分数的分母的最小公倍数(t)。
}
long long sum = 0;                  //化为以最小公倍数为分母后,各分数的分子之和
for(int j = 0;j<k;j++){
int item = t/S[j]*s[j];
sum+=item;
}
long long zs = sum/t;                     //化为以最小公倍数为分母后,整个分数的整数部分
long long f = sum-zs*t;                  //化为以最小公倍数为分母后,剩余分数的分子部分
simplification(f,t);                    //化简除去整形部分后的分数式
if(zs){                                 //整形部分不为0
if(f){                             //分子部分不为0
cout<<zs<<" "<<fenzhi<<"/"<<fenmu<<endl;
}
else{
cout<<zs<<endl;
}
}
else{
cout<<fenzhi<<"/"<<fenmu<<endl;
}
return 0;
}

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