1034. 有理数四则运算(20)
2015-09-08 20:27
253 查看
本题要求编写程序,计算2个有理数的和、差、积、商。
输入格式:
输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为0。
输出格式:
分别在4行中按照“有理数1 运算符 有理数2 = 结果”的格式顺序输出2个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的最简形式“k a/b”,其中k是整数部分,a/b是最简分数部分;若为负数,则须加括号;若除法分母为0,则输出“Inf”。题目保证正确的输出中没有超过整型范围的整数。
输入样例1:
输出样例1:
输入样例2:
输出样例2:
输入格式:
输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为0。
输出格式:
分别在4行中按照“有理数1 运算符 有理数2 = 结果”的格式顺序输出2个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的最简形式“k a/b”,其中k是整数部分,a/b是最简分数部分;若为负数,则须加括号;若除法分母为0,则输出“Inf”。题目保证正确的输出中没有超过整型范围的整数。
输入样例1:
2/3 -4/2
输出样例1:
2/3 + (-2) = (-1 1/3) 2/3 - (-2) = 2 2/3 2/3 * (-2) = (-1 1/3) 2/3 / (-2) = (-1/3)
输入样例2:
5/3 0/6
输出样例2:
1 2/3 + 0 = 1 2/3 1 2/3 - 0 = 1 2/3 1 2/3 * 0 = 0 1 2/3 / 0 = Inf
//写一个类储存分数,并且通过重载运算符,模拟纸面上的计算过程,在需要输出的时候算出转换成整数+真分数形式 #include <iostream> #include <cstdio> #include <cmath> using namespace std; long maxDivisor(long a, long b){ long t; while (true){ t = a%b; a = b; b = t; if (!t) return a; } } long minMultiple(long a, long b){ return a*b / maxDivisor(a, b); } class Fraction{ public: long a, b; public: Fraction(){}; Fraction(long _a, long _b, long _k = 0) :a(_a), b(_b){ getDivisor(); }; void getDivisor(){ //找出最大公约数,并且约分 long divsior = abs(maxDivisor(a, b)); a /= divsior; b /= divsior; //如果分子大于0分母小于0 if (a>0 && b<0){ a = -a; b = -b; } } void prlongFra() const { long k = a / b; long tmpA = a%b; if (k<0 && tmpA<0){ tmpA = -tmpA; } if (k<0 || (k == 0 && tmpA<0)) cout << "("; if (k != 0){ cout << k; if (tmpA != 0){ cout << " "; } } if (tmpA != 0){ cout << tmpA; if (b != 1){ cout << "/" << b; } } if (k == 0 && tmpA == 0){ cout << 0; } if (k<0 || (k == 0 && tmpA<0)) cout << ")"; } friend void operator +(const Fraction first, const Fraction second){ first.prlongFra(); cout << " + "; second.prlongFra(); cout << " = "; //找到最大公倍数,相加之后创建一个新的对象,然后输出 long b = minMultiple(first.b, second.b); long multipleA = b / first.b; long multipleB = b / second.b; long a = first.a*multipleA + second.a*multipleB; Fraction tmp(a, b); tmp.prlongFra(); } friend void operator -(const Fraction first, const Fraction second){ first.prlongFra(); cout << " - "; second.prlongFra(); cout << " = "; long b = minMultiple(first.b, second.b); long multipleA = b / first.b; long multipleB = b / second.b; long a = first.a*multipleA - second.a*multipleB; Fraction tmp(a, b); tmp.prlongFra(); } friend void operator *(const Fraction first, const Fraction second){ first.prlongFra(); cout << " * "; second.prlongFra(); cout << " = "; long a = first.a * second.a; long b = first.b * second.b; Fraction tmp(a, b); tmp.prlongFra(); } friend void operator /(const Fraction first, const Fraction second){ first.prlongFra(); cout << " / "; second.prlongFra(); cout << " = "; if (second.a){ long a = first.a * second.b; long b = first.b * second.a; Fraction tmp(a, b); tmp.prlongFra(); } else{ cout << "Inf"; } } }; int main(int argc, const char * argv[]) { int a, b; scanf("%d/%d", &a, &b); Fraction first(a, b); scanf("%d/%d", &a, &b); Fraction second(a, b); first + second; cout << endl; first - second; cout << endl; first * second; cout << endl; first / second; cout << endl; return 0; }
相关文章推荐
- 解决Win7下一个VC++6.0您不能直接打开多个project问题
- Linux Shell编程(2): for while
- hdu 5113 bfs
- HOG OpenCV 代码片段
- 不使用默认用户postgres安装PostgreSQL详细步骤
- jquery中$.ajax()方法详解
- 数据库部分、ContentProvider、BroadcastReceiver、Service
- 1033. 旧键盘打字(20)
- poj 1426 Find The Multiple 简单搜索
- log4j日志使用的一些初级心得
- HOG OpenCV 代码片段
- js加载XML文件
- [翻译] BezierString
- JAVA 第一个程序
- HDU2.3.3 Hat's Fibonacci
- UIday1002:UITableView 2 用UITableView实现通讯录cell简单的数据移动、删除、添加功能
- 定制以及彩色化自己的 Mac OS X 终端
- hdu 2012 素数判定
- 通过迁移的方式解决Active Directory服务器问题之5-恢复服务器的应用
- c++智能指针的使用