0
点赞
收藏
分享

微信扫一扫

分数四则运算(结构)

程序员阿狸 2022-04-02 阅读 94

题目描述

分数的分子和分母可用一个结构类型来表示。

编写实现两个分数加(addFS),减(subFS),乘(mulFS),除(divFS)的函数(要求计算结果分数是简化的),以及打印一个分数(printFS),计算两个整数最大公约数的函数(getGCD)。

注意:不能定义全局变量

输入

测试数据的组数 t

第一组第一个分数

第一组第二个分数

第二组第一个分数

第二组第二个分数

......

输出

第一组两个分数的和

第一组两个分数的差

第一组两个分数的积

第一组两个分数的商

第二组两个分数的和

第二组两个分数的差

第二组两个分数的积

第二组两个分数的商

.....

输入样例1

3
1/2
2/3
3/4
5/8
21/23
8/13

输出样例1

7/6
-1/6
1/3
3/4

11/8
1/8
15/32
6/5

457/299
89/299
168/299
273/184

提示

求两数a、b的最大公约数可采用辗转相除法,又称欧几里得算法,其步骤为:1. 交换a, b使a > b;2. 用a除b得到余数r,若r=0,则b为最大公约数,退出;3. 若r不为0,则用b代替a, r代替b,此时a,b都比上一次的小,问题规模缩小了;4. 继续第2步。

思路分析

首先一开始在考虑C++怎么格式输入,对于 / 这个字符好像不能像C语言一样控制格式输入,准备用scanf去处理了,后来想到直接用getchar()去把 / 给吞了。

分子和分母分开处理。

对于加法和减法,不管三七二十一直接通分处理。

对于乘法,那就是分子乘分子,分母乘分母。

对于除法,那就是分子乘分母,分母乘分子。

对于化简,分子和分母同时除以它们两个的最大公约数。

当分母是负数的时候,把分子变负,把分母变正。

在这道题,好像没有考虑到分母为1的情况。

AC代码

#include"iostream"
using namespace std;
struct fraction
{
int numerator,denominator;
};
fraction addFS(fraction a,fraction b)
{
fraction plus;
plus.numerator=a.denominator*b.numerator+a.numerator*b.denominator;
plus.denominator=a.denominator*b.denominator;
return plus;
}
fraction subFS(fraction a,fraction b)
{
fraction minus;
minus.numerator=a.numerator*b.denominator-b.numerator*a.denominator;
minus.denominator=a.denominator*b.denominator;
return minus;
}
fraction mulFS(fraction a,fraction b)
{
fraction mul;
mul.numerator=a.numerator*b.numerator;
mul.denominator=a.denominator*b.denominator;
return mul;
}
fraction divFS(fraction a,fraction b)
{
fraction div;
div.numerator=a.numerator*b.denominator;
div.denominator=a.denominator*b.numerator;
return div;
}
int getGCD(int a,int b)
{
int r=a%b;
while(r!=0)
{
a=b;
b=r;
r=a%b;
}
return b;
}
void printFS(fraction a)
{
int GCD=getGCD(a.numerator,a.denominator);
a.numerator/=GCD;
a.denominator/=GCD;
if(a.denominator<0)
{
a.numerator=-a.numerator;
a.denominator=-a.denominator;
}
cout<<a.numerator<<'/'<<a.denominator<<endl;
}
int main()
{
fraction a,b;
int test;
cin>>test;
while(test--)
{
cin>>a.numerator;
getchar();
cin>>a.denominator>>b.numerator;
getchar();
cin>>b.denominator;
printFS(addFS(a,b));
printFS(subFS(a,b));
printFS(mulFS(a,b));
printFS(divFS(a,b));
cout<<endl;
}
}
举报

相关推荐

0 条评论