PAT Basic 1034 有理数四则运算(20) [数学问题-分数的四则运算]

题目

本题要求编写程序,计算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

题目分析

已知两个有理数,进行加减乘除操作

解题思路

  1. 求最大公约数的函数,方便化简
  2. 分数化简函数
    2.1 分子为0,分母置为1
    2.2 分子与分母最大公约数化简
    2.3 分母为负,分子分母同时取反
  3. 分数打印
    3.1 假分数转换为整数部分+真分数部分再打印

Code

Code 01

#include <iostream>
using namespace std;
// 求最大公约数 
int gcd(long long a, long long b) {
	return b==0?abs(a):gcd(b,abs(a)%b);
}
// 化简 
void reduction(long long &a,long long &b) {
	if(b<0) { //若b小于0,分子分母同时取反
		a=-a;
		b=-b;
	}
	if(a==0) { // 若a为0,将分母置为1(同分子能被分母整除的情况统一处理)
		b=1;
	} else { // 分子分母公因数化简
		long long gcdv = gcd(a,b);
		a/=gcdv;
		b/=gcdv;
	}
}
// 打印分式 
void showi(long long a, long long b) {
	if(b==0||a==0) {
		printf("%s",a==0?"0":"Inf");
		return ;
	}
	long long tempa = a,tempb = b;
	reduction(tempa,tempb);
	if(tempa<0)printf("(");
	if(tempb==1)printf("%lld",tempa);
	else if(abs(tempa)>abs(tempb)) {
		printf("%lld %lld/%lld",tempa/tempb,abs(tempa%tempb),tempb);
	} else {
		if(tempa!=0)printf("%lld/%lld",tempa,tempb);
	}
	if(tempa<0)printf(")");
}
void add(long long a1, long long b1, long long a2, long b2) {
	showi(a1,b1);
	printf(" + ");
	showi(a2,b2);
	printf(" = ");
	showi(a1*b2+a2*b1,b1*b2);
	printf("
");
}
void sub(long long a1, long long b1, long long a2, long b2) {
	showi(a1,b1);
	printf(" - ");
	showi(a2,b2);
	printf(" = ");
	showi(a1*b2-a2*b1,b1*b2);
	printf("
");
}
void mul(long long a1, long long b1, long long a2, long b2) {
	showi(a1,b1);
	printf(" * ");
	showi(a2,b2);
	printf(" = ");
	showi(a1*a2,b1*b2);
	printf("
");
}
void div(long long a1, long long b1, long long a2, long b2) {
	showi(a1,b1);
	printf(" / ");
	showi(a2,b2);
	printf(" = ");
	showi(a1*b2,a2*b1);
	printf("
");
}
int main(int argc,char *argv[]) {
	long long a1,b1,a2,b2,gcdv;
	scanf("%lld/%lld %lld/%lld", &a1,&b1,&a2,&b2);
	add(a1,b1,a2,b2);
	sub(a1,b1,a2,b2);
	mul(a1,b1,a2,b2);
	div(a1,b1,a2,b2);
	return 0;
}
原文地址:https://www.cnblogs.com/houzm/p/12263203.html