1088 Rational Arithmetic (20分)

6 篇文章 0 订阅

在这里插入图片描述
在这里插入图片描述

  • 找最大公因数的方法,要用如下gcd函数,如果暴力找最大公因数的话会超时;
  • 要用long long表示分子分母,不然会超出范围;
  • 先提取负号,然后分子分母取绝对值,在返回前再把括号和符号加上。
#include<iostream>
#include<cmath>
#include<string>
using namespace std;
//找最大公因数
long long gcd(long long a, long long b) {
	if (b == 0)
		return a;
	else return gcd(b, a%b);
}
/*
分子分母均取绝对值,正负号和括号在最后加上。
*/
string getNum(long long n, long long d) {
	string res = "";
	if (n == 0)
		return "0";
	if (d == 0)
		return "Inf";
	bool negative = n < 0 && d > 0 || n > 0 && d < 0;
	n = abs(n), d = abs(d);
	long long k = n / d;
	n %= d;
	long long maxCommonFactor = gcd(n, d);
	n /= maxCommonFactor;
	d /= maxCommonFactor;
	if (k != 0) {	//整数部分
		res.append(to_string(k));
		if (n != 0)
			res.append(" ");
	}
	if (n != 0) {
		res += to_string(n) + "/" + to_string(d);
	}
	if (negative) {
		res= "(-" + res+ ")";
	}
	return res;
}
int main() {
	long long n1, d1, n2, d2;
	scanf("%lld/%lld %lld/%lld", &n1, &d1, &n2, &d2);
	long long n3, d3;
	cout << getNum(n1, d1) << " + " << getNum(n2, d2) << " = " << getNum(n1 * d2 + n2 * d1, d1 * d2) << endl;
	cout << getNum(n1, d1) << " - " << getNum(n2, d2) << " = " << getNum(n1 * d2 - n2 * d1, d1 * d2) << endl;
	cout << getNum(n1, d1) << " * " << getNum(n2, d2) << " = " << getNum(n1 * n2, d1 * d2) << endl;
	cout << getNum(n1, d1) << " / " << getNum(n2, d2) << " = " << getNum(n1 * d2, d1 * n2) << endl;
}

二刷:

#include<iostream>
#include<string>
#include<cmath>
using namespace std;
long long getLargestCommon(long long a, long long b) {
	a = abs(a), b = abs(b);
	if (b == 0)
		return a;
	else return getLargestCommon(b, a % b);
}
string toString(long long numerator, long long denominator) {
	if (denominator == 0) {
		return "Inf";
	}
	if (numerator >= 0 && denominator < 0) {
		numerator = -numerator;
		denominator = -denominator;
	}
	long long largestCommon = getLargestCommon(numerator, denominator);
	numerator /= largestCommon;
	denominator /= largestCommon;
	string res;
	long long integer = numerator / denominator;
	numerator %= denominator;
	if (integer != 0 || numerator == 0) {
		res += to_string(integer);
	}
	if (numerator != 0) {
		if (integer != 0) {
			res += " ";
			numerator = abs(numerator);
		}
		res += to_string(numerator) + "/" + to_string(denominator);
	}
	if (integer < 0 || numerator < 0) {
		res = "(" + res + ")";
	}
	return res;
}
int main() {
	long long d1, n1, d2, n2;
	scanf("%lld/%lld %lld/%lld", &n1, &d1, &n2, &d2);
	long long sum, difference;
	//sum & subtraction
	long long commonDenominator = d1 / getLargestCommon(d1, d2) * d2;
	sum = commonDenominator / d1 * n1 + commonDenominator / d2 * n2;
	difference = commonDenominator / d1 * n1 - commonDenominator / d2 * n2;
	//product & quotient
	long long productNumerator, productDenominator, quotientNumerator, quotientDenominator;
	productNumerator = n1 * n2;
	productDenominator = d1 * d2;
	quotientNumerator = n1 * d2;
	quotientDenominator = n2 * d1;
	string f1 = toString(n1, d1), f2 = toString(n2, d2);
	printf("%s + %s = %s\n", f1.c_str(), f2.c_str(), toString(sum, commonDenominator).c_str());
	printf("%s - %s = %s\n", f1.c_str(), f2.c_str(), toString(difference, commonDenominator).c_str());
	printf("%s * %s = %s\n", f1.c_str(), f2.c_str(), toString(productNumerator, productDenominator).c_str());
	printf("%s / %s = %s\n", f1.c_str(), f2.c_str(), toString(quotientNumerator, quotientDenominator).c_str());
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值