任务描述
本关任务:化简有理数。
相关知识
有理数的精确表示一般采用分数形式。分数的分子和分母都是整数,如果有理数为负数,则分子为负数,分母始终为正数。有理数的化简其实就是使分数成为最简分数,即通过化简使分子和分母互质。当分子为0时,分母应为1。
我们可以用两个整型变量来表示一个分数,但由于没有表示两个变量之间的逻辑关系,程序的可读性会很差。更好的方法是使用 C 和 C++ 的结构来表示。
测试说明
测试输入:-18/52
预期输出:-9/26
测试输入:128/4
预期输出:32
开始你的任务吧,祝你成功!
#include <iostream>
using namespace std;
struct rationalNumber{
int fenzi; // 分子
int fenmu; // 分母
};
// 函数reduction:有理数化简,对传入的有理数n进行化简
// 参数:n-有理数
// 返回值:无化简后的有理数
rationalNumber reduction(rationalNumber n);
int main()
{
char c;
rationalNumber x, y;
cin >> x.fenzi >> c >> x.fenmu; // 输入有理数,首先读入分子,然后是/,最后是分母
y = reduction(x); // 有理数化简
// 输出化简的结果
if(y.fenmu == 1)
cout << y.fenzi << endl;
else
cout << y.fenzi << "/" << y.fenmu << endl;
return 0;
}
rationalNumber reduction(rationalNumber n)
{
// 请在这里补充代码,实现函数reduction
/********** Begin *********/
rationalNumber m=n;
int a;
while(m.fenmu!=0){//求最大公约数,辗转相除法
a=m.fenzi%m.fenmu;
m.fenzi=m.fenmu;
m.fenmu=a;
}
m.fenzi=(m.fenzi>0)?m.fenzi:-m.fenzi;//防止出现最大公约数是负数的情况
n.fenzi/=m.fenzi;
n.fenmu/=m.fenzi;
return n;
/********** End **********/
}