题目描述

本题要求编写程序,计算2个有理数的和、差、积、商。

输入描述:
输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为0。

输出描述:
分别在4行中按照“有理数1 运算符 有理数2 = 结果”的格式顺序输出2个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的最简形式“k a/b”,其中k是整数部分,a/b是最简分数部分;若为负数,则须加括号;若除法分母为0,则输出“Inf”。题目保证正确的输出中没有超过整型范围的整数。

输入例子:
5/3 0/6

输出例子:
1 2/3 + 0 = 1 2/3
1 2/3 - 0 = 1 2/3
1 2/3 * 0 = 0
1 2/3 / 0 = Inf

我编写的本地测试用例

2/3 -4/2
答案:
2/3 + (-2) = (-1 1/3)
2/3 - (-2) = 2 2/3
2/3 * (-2) = (-1 1/3)
2/3 / (-2) = (-1/3)

5/3 0/6
答案:
1 2/3 + 0 = 1 2/3
1 2/3 - 0 = 1 2/3
1 2/3 * 0 = 0
1 2/3 / 0 = Inf

0/3 0/6
我的结果:
0 + 0 = 0
0 - 0 = 0
0 * 0 = 0
0 / 0 = Inf

-0/3 -0/6
我的结果:
0 + 0 = 0
0 - 0 = 0
0 * 0 = 0
0 / 0 = Inf

5/3 -4/2
我的结果:
1 2/3 + (-2) = (-1/3)
1 2/3 - (-2) = 3 2/3
1 2/3 * (-2) = (-3 1/3)
1 2/3 / (-2) = (-5/6)

-65535/65534 -1/2
我的结果:
(-1 1/65534) + (-1/2) = (-1 16384/32767)
(-1 1/65534) - (-1/2) = (-16384/32767)
(-1 1/65534) * (-1/2) = 65535/131068
(-1 1/65534) / (-1/2) = 2 1/32767

代码

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class Rational
{public:int up;int down;void input(int up, int down);
};
//构造器
void Rational::input(int up, int down)
{this->up = up;this->down = down;
}//通分
void reduction(Rational* r1, Rational* r2)
{int fenMu = r1->down*r2->down;r1->up *= r2->down;r2->up *= r1->down;r1->down = fenMu;r2->down = fenMu;}
//格式化输出
void SimplifyOutput(Rational num)
{int up = num.up;//分母int down = num.down;//分子if (up == 0)//如果分母为0则直接输出{cout << '0';return;}//找最大公因数、约分int factor;//临时公因数int maxFactor = 1;//最大公因数int min = up > down ? up : down;for (factor = 1; factor <= min; factor++){if (up%factor == 0 && down%factor == 0)//找到公因数{maxFactor = factor;}}up /= maxFactor;down /= maxFactor;//打印if (num.up < 0){cout << "(";//先打印符号if (num.up < 0){up *= (-1);cout << "-";}int integer = up / down;if (integer != 0 && up%down == 0){cout << integer;}else if (integer != 0 && up%down != 0){cout << integer << " ";}if (up%down == 0 && integer != 0)//如果分母为0则不输出{cout << ")";return;}cout << up % down << "/" << down;cout << ")";}else{int integer = up / down;if (integer != 0){cout << integer << " ";}if (up%down == 0 && integer != 0)//如果分母为0则不输出{return;}cout << up % down << "/" << down;}
}
//加法
void add(Rational left, Rational right)
{reduction(&left, &right);//通分//计算Rational result;result.up = left.up + right.up;result.down = left.down;//打印SimplifyOutput(left);cout << " + ";SimplifyOutput(right);cout << " = ";SimplifyOutput(result);
}
//减法
void sub(Rational left, Rational right)
{reduction(&left, &right);//通分//计算Rational result;result.up = left.up - right.up;result.down = left.down;//打印SimplifyOutput(left);cout << " - ";SimplifyOutput(right);cout << " = ";SimplifyOutput(result);
}
//乘法
void multiply(Rational left, Rational right)
{//计算Rational result;result.up = left.up*right.up;result.down = left.down*right.down;//打印SimplifyOutput(left);cout << " * ";SimplifyOutput(right);cout << " = ";SimplifyOutput(result);
}
//除法
void division(Rational left, Rational right)
{//计算Rational result;result.up = left.up*right.down;result.down = left.down*right.up;//让负号始终在分母上if (result.down < 0){result.down *= (-1);result.up *= (-1);}//打印SimplifyOutput(left);cout << " / ";SimplifyOutput(right);cout << " = ";if (right.up == 0)//如果除数是0{cout << "Inf";return;}SimplifyOutput(result);
}int main()
{Rational left, right;//输入int a1, a2, b1, b2;scanf("%d/%d %d/%d", &a1, &a2, &b1, &b2);left.up = a1;left.down = a2;right.up = b1;right.down = b2;//加法add(left, right);cout << endl;//减法sub(left, right);cout << endl;//乘法multiply(left, right);cout << endl;//除法division(left, right);
}

牛客网_PAT乙级_10234有理数四则运算(20)【通过5/7:格式错误】相关推荐

  1. 牛客网_PAT乙级_1019. 数字黑洞 (20)

    总结 注意!! 想要在函数中结束程序,一定不要用system("pause");,因为这样只是让程序暂停,结果就是运行时间超时,无法通过所有的测试用例. 那么,C++ 程序中什么函 ...

  2. 牛客网_PAT乙级_1019旧键盘 (20)

    题目描述 旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及实际被输入的文字,请你列出肯定坏掉的那些键. 输入描述: 输入在2行中分别给出应该输入的文字 ...

  3. 牛客网_PAT乙级_1018人口普查(20)

    题目描述 某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个输入的日期都是合法的,但不一定是合理的--假设已知镇上没有超过200岁的老人,而今天是20 ...

  4. 牛客网_PAT乙级_1017打印沙漏(20)

    题目描述 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 ***************** 所谓"沙漏形状",是指每 ...

  5. 牛客网_PAT乙级1007_A除以B (20)

    题目描述 本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数.你需要输出商数Q和余数R,使得A = B * Q + R成立. 输入描述: 输入在1行中依次给出A和B,中间以1空格分隔 ...

  6. 牛客网_PAT乙级1002_数字分类 (20)

    #include<stdio.h> #include<stdlib.h> int main() {int num;int a[1000] = { 0 };int i;int f ...

  7. 牛客网_PAT乙级_1010月饼 (25)

    因为黑框框里放不下,(非官网)测试用例用txt导入: 这题有一个陷阱,官网上说给非0数,测试用例却出现了0,0吨的月饼能卖507元,而且这样的月饼要最先卖,因为它的price是inf,卖掉0吨净赚50 ...

  8. 牛客网_PAT乙级_1029有几个PAT(25)【输入字符串并strlen计算长度】

    题目描述 字符串APPAPT中包含了两个单词"PAT",其中第一个PAT是第2位§,第4位(A),第6位(T):第二个PAT是第3位§,第4位(A),第6位(T). 现给定字符串, ...

  9. 牛客网_PAT乙级_1028到底买不买(20)【用iterator迭代器,对两个vectorchar比较,删除相同元素】

    题目描述 小红想买些珠子做一串自己喜欢的珠串.卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖.于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少 ...

最新文章

  1. python-opencv 形态学
  2. 编程能力如何突飞猛进?
  3. (转)个例子让你了解Java反射机制
  4. Leaflet中获取两个地理坐标点之间的距离
  5. unix到底有啥用_观点|什么是Unix以及它为什么这么重要?
  6. c枚举类型enum例题_SystemVerilog数据类型
  7. eval函数 php_PHP的一句话木马代码和函数eval的简介
  8. netty冲突 play sbt_《Netty官方文档》本地传输接口
  9. 如何复制图文消息封面图片?正文没显示
  10. SAP License:SAP顾问面试问题
  11. 2020 年 AI 产业报告:100 个岗位抢 1 个人,计算机视觉成最大缺口
  12. 20个编写现代 CSS 代码的建议
  13. assert函数_类成员函数指针在成员函数内部的调用
  14. 二手车交易价格预测 ——EDA 探索性数据分析
  15. Android Red5视频通讯第一篇:连接服务器
  16. 探索iptables BPF模块的悲惨历程
  17. 如何在软件开发行业选择一条正确的职业道路?
  18. 【FFMPEG】AVFrame中buffer分配的两种方式
  19. 薛蛮子和前8848总裁吕春维共同创立的车托帮
  20. 论“东数西算”对气象行业的影响

热门文章

  1. FaceBook机器学习开源DL模块
  2. POJ2528 线段树+离散化+hash(成段更新)
  3. Burnside引理和Polya定理学习笔记
  4. 【Boost】boost库中的小工具enable_shared_from_this
  5. 【Boost】boost库中智能指针——shared_ptr
  6. 多进程和多线程的优缺点
  7. 在Android中使用Protocol Buffers
  8. 技术转管理的“苦”,我懂......
  9. 从上海到旧金山,2021 LiveVideoStackCon回归上海
  10. “云端一体”的智能媒体生产制作演讲之路