洛谷题单指南-数学基础问题-P1572 计算分数
原题链接:https://www.luogu.com.cn/problem/P1572
题意解读:计算分数+、-运算的结果。
解题思路:
根据题目要求,逐项计算并约分,则不会超int,问题就比较直接了
定义a1/b1为前一项的分子分母,a2/b2为当前项的分子分母
依次遍历字符串,处理出分子和分母,本题的关键其实是字符串的处理
当读取到分子、分母后,存入a2、b2,并与a1、b1进行分数运算(a1初始值0,b1初始值1)
运算时可以这样处理:将分数前面的符号处理成1(正)或-1(负),并乘以分子,这样分数都可以用加法来运算
a1 = a1 * b2 + a2 * b1,b1 = b1 * b2
再a1、b1进行约分,
约分即a1 = a1 / gcd(abs(a1), abs(b1)),b1 = b1 / gcd(abs(a1), abs(b1))
最终输出结果即可。
100分代码:
#include <bits/stdc++.h>
using namespace std;
int gcd(int a, int b)
{
if(b == 0) return a;
return gcd(b, a % b);
}
int main()
{
int sign = 1; //符号
int a1 = 0, b1 = 1; //前一个分子、分母
int a2, b2; //后一个分子、分母
bool up = true; //即将读入的是否是分子
string s;
cin >> s;
for(int i = 0; i < s.size(); i++)
{
char c = s[i];
if(c == '+') sign = 1;
if(c == '-') sign = -1;
if(c >= '0' && c <= '9')
{
int num = c - '0';
int j;
for(j = i + 1; s[j] >= '0' && s[j] <= '9'; j++)
{
num = 10 * num + s[j] - '0'; //提取数字到num
}
i = j - 1; // i下次从最后一个数字后一个字符开始读
if(up)
{
a2 = num * sign; //读入到分子,符号跟随分子
up = !up; //下次读入到分母
}
else
{
b2 = num; //读入到分母
//计算两个分数的和
a1 = a1 * b2 + a2 * b1;
b1 = b1 * b2;
//cout << a1 << "/" << b1 << endl;
//约分
int g = gcd(abs(a1), abs(b1));
a1 /= g;
b1 /= g;
up = !up; //下次读入到分子
}
}
if(c == '/') continue;
}
if(a1 == 0) cout << 0;
else if(b1 == 1) cout << a1;
else cout << a1 << "/" << b1;
return 0;
}