PAT-basic-1034 有理数四则运算
一、题目
本题要求编写程序,计算 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
二、解析
细节题,首先要注意输出格式,这里选择先将每一个有理数转化为要求的格式,然后统一加减乘除。定义加减乘除的时候需要注意除法,分母为0的情况。此外控制负数最好只出现在分子。
三、代码
java :
查看代码
package shuati;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Scanner;
public class PAT_BASIC_1034 {
private static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
private static Scanner input = new Scanner(System.in);
public static void main(String[] args) throws IOException {
String str[] = input.nextLine().split("[\\s+/]");
Rational r1 = new Rational(Long.parseLong(str[0]), Long.parseLong(str[1]));
Rational r2 = new Rational(Long.parseLong(str[2]), Long.parseLong(str[3]));
Rational.printRes(r1, r2);
// Rational r = new Rational(24, 36);
// long gdb = r.getGdb();
// System.out.println(gdb);
}
private static class Rational{
long fz;
long fm;
public Rational() {}
public Rational(long fz, long fm) {
if(fm<0 && fz<0 || fm<0 && fz>0){
fz = -1 * fz;
fm = -1 * fm;
}
long gcd = getGcd(fz, fm);
this.fz = fz/gcd;
this.fm = fm/gcd;
// System.out.println("gcd: " + gcd +", Rational: " + this.fz + " " + this.fm);
}
public String getString(){
if(fz == 0 || fm == 0) return "0";
long num1 = Math.abs(fz);
long num2 = fm;
StringBuffer buf = new StringBuffer();
if(fz < 0)
buf.append("(-");
if(num1 >= num2){
long k = num1/num2;
long a = num1 - k*num2;
buf.append(k);
if(a != 0){
buf.append(" ");
buf.append(a + "/" + num2);
}
}else
buf.append(num1 + "/" + num2);
if(fz < 0)
buf.append(")");
return buf.toString();
}
public long getGcd(long fz, long fm){
if(fz==0 || fm ==0) return 1;
long num1 = Math.abs(fz), num2 = Math.abs(fm);
long temp = num1 % num2;
while(temp != 0){
num1 = num2;
num2 = temp;
temp = num1 % num2;
}
return num2;
}
public static void printRes(Rational r1, Rational r2){
String s1 = r1.getString();
String s2 = r2.getString();
System.out.printf("%s + %s = %s\n",s1 , s2, add(r1, r2).getString());
System.out.printf("%s - %s = %s\n",s1 , s2, sub(r1, r2).getString());
System.out.printf("%s * %s = %s\n",s1 , s2, mul(r1, r2).getString());
if(div(r1, r2) == null)
System.out.printf("%s / %s = Inf\n", s1, s2);
else
System.out.printf("%s / %s = %s\n",s1 , s2, div(r1, r2).getString());
}
public static Rational add(Rational r1, Rational r2){
long fz1 = r1.fz, fm1 = r1.fm;
long fz2 = r2.fz, fm2 = r2.fm;
long newFm = fm1 * fm2;
long newFz = fz1*fm2 + fz2*fm1;
Rational res = new Rational(newFz, newFm);
return res;
}
public static Rational sub(Rational r1, Rational r2){
long newFm = r1.fm * r2.fm;
long newFz = r1.fz*r2.fm - r2.fz*r1.fm;
return new Rational(newFz, newFm);
}
public static Rational mul(Rational r1, Rational r2){
long newFm = r1.fm * r2.fm;
long newFz = r1.fz * r2.fz;
return new Rational(newFz, newFm);
}
public static Rational div(Rational r1, Rational r2){
if(r2.getString().equals("0")) return null;
long newFm = r1.fm * r2.fz;
long newFz = r1.fz * r2.fm;
return new Rational(newFz, newFm);
}
}
}
c++:
查看代码
//
// Created by dongdong on 2023/4/13.
//
#include "iostream"
typedef long long Long;
class Rational{
public:
Long fz;
Long fm;
Rational(){};
Rational(Long fz, Long fm){
if(fm<0 && fz<0 || fm<0 && fz>0){
fz = -1 * fz;
fm = -1 * fm;
}
Long gcd = getGcd(fz, fm);
this->fz = fz/gcd;
// printf("fenmu: %lld\n", fm);
this->fm = fm/gcd;
// printf("INITIAL: %lld %lld %lld\n", gcd, this->fz, this->fm);
}
std::string getString(){
if(fz == 0 || fm == 0) return "0";
Long num1 = std::abs(fz);
Long num2 = fm;
std::string buf;
if(fz < 0)
buf.append("(-");
if(num1 >= num2){
Long k = num1 / num2;
Long a = num1 - k*num2;
buf.append(std::to_string(k));
if(a != 0){
buf.append(" ");
buf.append(std::to_string(a) + "/" + std::to_string(num2));
}
}else{
buf.append(std::to_string(num1)+"/"+std::to_string(num2));
}
if(fz < 0)
buf.append(")");
return buf;
};
Long getGcd(Long fz, Long fm){
if(fz==0 || fm==0) return 1;
Long num1 = std::abs(fz), num2 = std::abs(fm);
Long temp = num1 % num2;
while(temp != 0){
num1 = num2;
num2 = temp;
temp = num1 % num2;
}
return num2;
}
static void printRes(Rational r1, Rational r2){
std::string s1 = r1.getString();
std::string s2 = r2.getString();
printf("%s + %s = %s\n",s1.c_str() , s2.c_str(), add(r1, r2).getString().c_str());
printf("%s - %s = %s\n",s1.c_str() , s2.c_str(), sub(r1, r2).getString().c_str());
printf("%s * %s = %s\n",s1.c_str() , s2.c_str(), mul(r1, r2).getString().c_str());
if(r2.getString().compare("0") == 0)
printf("%s / %s = Inf\n", s1.c_str(), s2.c_str());
else
printf("%s / %s = %s\n",s1.c_str(), s2.c_str(), div(r1, r2).getString().c_str());
}
static Rational add(Rational r1, Rational r2){
Long fz1 = r1.fz, fm1 = r1.fm;
Long fz2 = r2.fz, fm2 = r2.fm;
Long newFm = fm1 * fm2;
Long newFz = fz1*fm2 + fz2*fm1;
Rational res(newFz, newFm);
return res;
}
static Rational sub(Rational r1, Rational r2){
Long newFm = r1.fm * r2.fm;
Long newFz = r1.fz*r2.fm - r2.fz*r1.fm;
return Rational(newFz, newFm);
}
static Rational mul(Rational r1, Rational r2){
long newFm = r1.fm * r2.fm;
long newFz = r1.fz * r2.fz;
return Rational(newFz, newFm);
}
static Rational div(Rational r1, Rational r2){
// if(r2.getString().compare(0) == 0) return Rational();
long newFm = r1.fm * r2.fz;
long newFz = r1.fz * r2.fm;
return Rational(newFz, newFm);
}
};
int main(){
Long a1, a2, b1, b2;
scanf("%lld/%lld %lld/%lld", &a1, &a2, &b1, &b2);
// printf("%lld %lld %lld %lld\n", a1, a2, b1, b2);
Rational r1(a1, a2);
Rational r2(b1, b2);
Rational::printRes(r1, r2);
return 0;
}