题目:输入形如“-1/2+3/7-9/1”这样的分数算式字符串,要求也以分数的形式输出正确的计算结果(整数写成分母为1的分数,另外输出结果必须是不可约的分数)。[Leetcode 592]
思路:
1,分数的加减法全部统一为加法,采用同化分母的方法,然后约分。
2,约分需要用到最大公约数。
3,隐藏的难点:字符串的处理。如何将输入的字符串切割成井然有序的各个数值和运算符,这一点可以用 sstream.h 头文件中 istringstream 型的字符串流轻松做到。
4,有多个需要运算且是依次输入的对象时,尽量不要有“把这些对象先找个类似数组的结构存起来,再一起运算”的想法,而是改成“从第一个开始,循环叠加处理后面的每一个,直至遇到空”!
#include <iostream>
#include <string>
#include<sstream>
using namespace std;
int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a%b);
}
int main() {
string str;
while (cin >> str) {
istringstream iss(str);
int N=0, M=1,n,m; //初始的分子、分母
char slash; //用于接收斜杠符
while (iss >> n >> slash >> m) {
//N/M+n/m=(N*m+n*M)/mM
N = N*m + n*M;
M = m*M;
int g = abs(gcd(N, M));
N /= g;
M /= g;
}
cout << to_string(N) << "/" << to_string(M) << endl;
}
}
几个细节:1)设置了初始的分子分母,后面的数据在此之上叠加;2)while循环在没有流可以流入变量n m等的时候会终止;3)M的运算式决定了它永远是正数,所以不需要担心负号出现在分母的情况,这也是为什么最大公约数要取绝对值才用于除M;