分数的加减法

题目:输入形如“-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;


参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页

打赏作者

那个松鼠很眼熟

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值