洛谷P1572 计算分数
题目链接:P1572 计算分数 - 洛谷 | 计算机科学教育新生态
题目难度:普及一
题目分析:这道题就是纯模拟题,我们首先定义以下几种操作:
- 定义一个结构体存分子和分母
struct fs { ll fm, fz; };
- 求最大公约数的函数(用于通分)
ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b, a % b); }
- 定义对分数约分
fs yf(fs a) { ll t = gcd(a.fm, a.fz); a.fm /= t; a.fz /= t; return a;//举个例子 8/6先求出最大公约数即24然后分子分母同时除以最大公约数得到最简的4/3 }
- 定义对分数相加
fs jia(fs a, fs b) { ll t = a.fm * b.fm;//对分母通分才能相加例如: 5/7 + 2/3 先让分母等于 21 然后分别对分子通分得到15 / 21 和14 / 21 a.fz *= b.fm; b.fz *= a.fm; a.fm = t; b.fm = t; fs ans; ans.fz = a.fz + b.fz; ans.fm = t; return yf(ans);//最后返回约分结果 }
- 定义对分数减法
fs jian(fs a, fs b) {//同加法类似 ll t = a.fm * b.fm; a.fz *= b.fm; b.fz *= a.fm; a.fm = t; b.fm = t; fs ans; ans.fz = a.fz - b.fz; ans.fm = t; return yf(ans); }
最后奉上全部代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; struct fs { ll fm, fz; }; ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b, a % b); } fs yf(fs a) { ll t = gcd(a.fm, a.fz); a.fm /= t; a.fz /= t; return a;//举个例子 8/6先求出最大公约数即24然后分子分母同时除以最大公约数得到最简的4/3 } fs jia(fs a, fs b) { ll t = a.fm * b.fm;//对分母通分才能相加例如: 5/7 + 2/3 先让分母等于 21 然后分别对分子通分得到15 / 21 和14 / 21 a.fz *= b.fm; b.fz *= a.fm; a.fm = t; b.fm = t; fs ans; ans.fz = a.fz + b.fz; ans.fm = t; return yf(ans);//最后返回约分结果 } fs jian(fs a, fs b) {//同加法类似 ll t = a.fm * b.fm; a.fz *= b.fm; b.fz *= a.fm; a.fm = t; b.fm = t; fs ans; ans.fz = a.fz - b.fz; ans.fm = t; return yf(ans); } int main() { fs a, b; char ysf; scanf("%lld/%lld", &a.fz, &a.fm); a = yf(a); while (cin >> ysf) { if (ysf == '+' || ysf == '-') { scanf("%lld/%lld", &b.fz, &b.fm); b = yf(b); if (ysf == '+') { a = jia(a, b); } else if (ysf == '-') { a = jian(a, b); } } } if (a.fm < 0 && a.fz > 0) { a.fm = abs(a.fm); a.fz = -a.fz; } if (a.fm == 1) { cout << a.fz; } else { cout << a.fz << '/' << a.fm; } return 0; }