天梯赛模拟题_(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;
}完整代码:
(注意:所有分子和分母都在长整型范围内)。但还是没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; }
相关文章推荐