7-9 N个数求和 (20 分)
本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。
输入格式:
输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 …给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。
输出格式:
输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。
输入样例1:
5
2/5 4/15 1/30 -2/60 8/3
输出样例1:
3 1/3
输入样例2:
2
4/3 2/3
输出样例2:
2
输入样例3:
3
1/3 -1/6 1/8
输出样例3:
7/24
个人觉得这道题挺难的
好多地方我也不知道错哪了
20分的题 我就拿了15分
有没有高手可以指点一下的
兄弟们想看代码的可以参考一下
要是能写出来通过全部样例的话
希望能够私信我或在评论区评论也可以
#include <iostream>
#include <cstring>
#include <math.h>
using namespace std;
class Sum{
public:
int sum_zi;
int sum_mu;
};
void yueFen(Sum &sum){
int a = sum.sum_zi;
int b = sum.sum_mu;
int big = max(abs(sum.sum_zi),abs(sum.sum_mu));
for(int i=big; i>=1; i--){
if(sum.sum_zi % i == 0 && sum.sum_mu % i == 0){
sum.sum_zi = sum.sum_zi / i;
sum.sum_mu = sum.sum_mu / i;
}
}
}
int main() {
int N;
int zi;
int mu;
Sum sum;
sum.sum_zi = 0;
sum.sum_mu = 0;
cin>>N;
if(N == 0) {
return 0;
}
if(N == 1){
scanf("%d/%d",&zi,&mu);
cout << zi <<"/" << mu << endl;
return 0;
}
int pu_zi = -1;
int pu_mu = -1;
while(N--){
// cin>>zi;
// getchar(); // '/' out it
// cin>>mu;
scanf("%d/%d",&zi,&mu);
if(sum.sum_mu == 0){
sum.sum_zi = zi;
sum.sum_mu = mu;
}
else{
int tmp = mu;
sum.sum_zi = (sum.sum_zi*tmp)+(sum.sum_mu*zi);
sum.sum_mu = sum.sum_mu*tmp;
// cout << sum.sum_zi <<"/" << sum.sum_mu << endl; // ce shi dai ma
}
}
if( sum.sum_zi % sum.sum_mu == 0 ){
cout << sum.sum_zi/sum.sum_mu << endl;
}
else if(abs(sum.sum_zi) > sum.sum_mu){
int m = sum.sum_zi/sum.sum_mu; // zheng shu bu fen
// xie xiao shu bu fen
sum.sum_zi = sum.sum_zi - m * sum.sum_mu;
cout << m << " ";
yueFen(sum);
//
// if(sum.sum_mu % sum.sum_zi == 0){
// sum.sum_mu = sum.sum_mu / sum.sum_zi;
// sum.sum_zi = 1;
//
// }
cout << sum.sum_zi <<"/" << sum.sum_mu << endl;
}
else if(sum.sum_zi == 0){
cout << 0 << endl;
}else {
yueFen(sum);
cout << sum.sum_zi <<"/" << sum.sum_mu << endl;
}
}