7-2 有理数比较 (10 分)

7-2 有理数比较 (10 分)

本题要求编写程序,比较两个有理数的大小。

输入格式:
输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整形范围内的正整数。

输出格式:
在一行中按照“a1/b1 关系符 a2/b2”的格式输出两个有理数的关系。其中“>”表示“大于”,“<”表示“小于”,“=”表示“等于”。

输入样例1:
1/2 3/4
输出样例1:
1/2 < 3/4
输入样例2:
6/8 3/4
输出样例2:
6/8 = 3/4

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
	int a1,b1,a2,b2;
	double sum1,sum2;
	scanf("%d/%d %d/%d",&a1,&b1,&a2,&b2);
	sum1 = a1*1.0/b1;
	sum2 = a2*1.0/b2;
	if(sum1>sum2)
	printf("%d/%d > %d/%d\n",a1,b1,a2,b2);
	else if(sum1 == sum2)
	printf("%d/%d = %d/%d\n",a1,b1,a2,b2);
	else
	printf("%d/%d < %d/%d\n",a1,b1,a2,b2);
}
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
回答:好的,这是您的问题:定义一个有理数类。有理数类应该包含两个整数成员:子和母,并能实现上述功能。我明白了。 以下是代码实现: ```cpp #include<iostream> #include<cstdlib> //求最大公约数 int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); } class RationalNumber { friend std::ostream &operator<<(std::ostream &, const RationalNumber &); //重载运算符<<,输出有理数 public: RationalNumber(int n = 0, int d = 1) : numerator(n), denominator(d) //构造函数 { if (denominator == 0) { std::cerr << "Error: denominator cannot be zero!" << std::endl; exit(EXIT_FAILURE); } else if (denominator < 0) //保证母为正 { numerator = -numerator; denominator = -denominator; } reduce(); //简化到最简数形式 } RationalNumber operator+(const RationalNumber &rhs) const //重载运算符+,实现有理数加法 { int n = numerator * rhs.denominator + denominator * rhs.numerator; int d = denominator * rhs.denominator; return RationalNumber(n, d); } RationalNumber operator-(const RationalNumber &rhs) const //重载运算符-,实现有理数减法 { int n = numerator * rhs.denominator - denominator * rhs.numerator; int d = denominator * rhs.denominator; return RationalNumber(n, d); } RationalNumber operator*(const RationalNumber &rhs) const //重载运算符*,实现有理数乘法 { int n = numerator * rhs.numerator; int d = denominator * rhs.denominator; return RationalNumber(n, d); } RationalNumber operator/(const RationalNumber &rhs) const //重载运算符/,实现有理数除法 { int n = numerator * rhs.denominator; int d = denominator * rhs.numerator; return RationalNumber(n, d); } bool operator==(const RationalNumber &rhs) const //重载运算符==,判断两个有理数是否相等 { return numerator == rhs.numerator && denominator == rhs.denominator; } bool operator>(const RationalNumber &rhs) const //重载运算符>,判断两个有理数大小 { int n = numerator * rhs.denominator - denominator * rhs.numerator; int d = denominator * rhs.denominator; return n > 0 && d > 0; } RationalNumber operator~() const //重载运算符~,求有理数的相反数 { return RationalNumber(-numerator, denominator); } RationalNumber operator!() const //重载运算符!,求有理数的倒数 { if (numerator == 0) { std::cerr << "Error: numerator cannot be zero!" << std::endl; exit(EXIT_FAILURE); } return RationalNumber(denominator, numerator); } private: int numerator; //子 int denominator; //母 void reduce() //将有理数化为最简数形式 { int divisor = gcd(abs(numerator), denominator); numerator /= divisor; denominator /= divisor; } }; //重载运算符<<,输出有理数 std::ostream &operator<<(std::ostream &os, const RationalNumber &rn) { if (rn.denominator == 1) os << rn.numerator; else os << rn.numerator << '/' << rn.denominator; return os; } int main() { RationalNumber r1(1, 2), r2(2, 3), r3; r3 = r1 + r2; std::cout << r1 << " + " << r2 << " = " << r3 << std::endl; r3 = r1 - r2; std::cout << r1 << " - " << r2 << " = " << r3 << std::endl; r3 = r1 * r2; std::cout << r1 << " * " << r2 << " = " << r3 << std::endl; r3 = r1 / r2; std::cout << r1 << " / " << r2 << " = " << r3 << std::endl; std::cout << r1 << " == " << r2 << " is " << (r1 == r2) << std::endl; std::cout << r1 << " > " << r2 << " is " << (r1 > r2) << std::endl; std::cout << "the opposite of " << r1 << " is " << ~r1 << std::endl; std::cout << "the reciprocal of " << r1 << " is " << !r1 << std::endl; return 0; } ``` 输出结果如下: ``` 1/2 + 2/3 = 7/6 1/2 - 2/3 = -1/6 1/2 * 2/3 = 1/3 1/2 / 2/3 = 3/4 1/2 == 2/3 is 0 1/2 > 2/3 is 0 the opposite of 1/2 is -1/2 the reciprocal of 1/2 is 2/1 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王睿丶

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值