【PTA-A】1081 Rational Sum(分数运算、求最大公约数)
题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805386161274880
思路:
1.创建结构体存储分子和分母
2.分数依次相加,每加一次就进行约分。
3.判断最终的分数,如果是整数输出整数,如果是假分数输出整数部分+分数部分,其他输出分数。
注意点:
1.使用long long而不是int
2.每次相加都要约分,不然可能会数字过大溢出
3.找最大公约数的函数
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
ll curzi, curmu;
int j;
struct Node {
ll zi, mu;//分子,分母
}no[105];
//找最大公约数
ll gcd(ll a, ll b) {
return b == 0 ? a : gcd(b, a % b);
}
//约分并更新
void yuefen() {
if (curzi == 0) {
no[j].mu = 1;
no[j].zi = 0;
return;
}
else {
ll d = gcd(curzi, curmu);
no[j].zi = curzi / d;
no[j].mu = curmu / d;
}
}
//前后相加
void add(Node a,Node b) {
curmu = a.mu * b.mu;
curzi = a.zi * b.mu + b.zi * a.mu;
yuefen();
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
scanf("%lld/%lld", &no[i].zi, &no[i].mu);
}
for (j= 1; j < n; j++) {
add(no[j], no[j - 1]);
}
ll a = no[j - 1].zi;
ll b = no[j - 1].mu;
//整数
if (a % b == 0) { cout << a / b; }
//假分数
else if(a/b>1){
cout << a / b << " ";
printf("%lld/%lld", a % b, b);
}
//真分数
else{ printf("%lld/%lld", a % b, b); }
return 0;
}

浙公网安备 33010602011771号