分数的加减法

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


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值