0
点赞
收藏
分享

微信扫一扫

分数四则运算(结构)

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

题目描述

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

编写实现两个分数加(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 条评论