--------------------------------------------------------------------------------------------------------------------------------------------------------
时间限制:1秒 空间限制:32768K 代码长度限制 100 KB
--------------------------------------------------------------------------------------------------------------------------------------------------------
题目描述
本题要求编写程序,计算2个有理数的和、差、积、商。
输入描述:
输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数, 负号只可能出现在分子前,分母不为0。
输出描述:
分别在4行中按照“有理数1 运算符 有理数2 = 结果”的格式顺序输出2个有理数的和、差、积、商。注意输出的 每个有理数必须是该有理数的最简形式“k a/b”,其中k是整数部分,a/b是最简分数部分;若为负数, 则须加括号;若除法分母为0,则输出“Inf”。题目保证正确的输出中没有超过整型范围的整数。
输入例子:
5/3 0/6
输出例子:
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).将分数化为带分数形式时,先相除再取余,负数特殊处理一下;
(3).加减乘除四则运算只是分子和分母的不同变换,将变化后的分子分母进行格式化即可。
--------------------------------------------------------------------------------------------------------------------------------------------------------
package com.biyao.algorithm.niuke.a1;
import java.util.Scanner;
public class Main_a1_024 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while(scan.hasNext()){
String num1 = scan.next();
String num2 = scan.next();
int fenzi1 = Integer.parseInt(num1.split("/")[0]);
int fenmu1 = Integer.parseInt(num1.split("/")[1]);
int fenzi2 = Integer.parseInt(num2.split("/")[0]);
int fenmu2 = Integer.parseInt(num2.split("/")[1]);
//+
String add = formatNum(fenzi1,fenmu1) + " + " + formatNum(fenzi2,fenmu2) + " = " + formatNum(fenzi1*fenmu2+fenzi2*fenmu1,fenmu1*fenmu2);
System.out.println(add);
//-
String subtract = formatNum(fenzi1,fenmu1) + " - " + formatNum(fenzi2,fenmu2) + " = " + formatNum(fenzi1*fenmu2-fenzi2*fenmu1,fenmu1*fenmu2);
System.out.println(subtract);
//*
String multiply = formatNum(fenzi1,fenmu1) + " * " + formatNum(fenzi2,fenmu2) + " = " + formatNum(fenzi1*fenzi2,fenmu1*fenmu2);
System.out.println(multiply);
// '/'
String divide = formatNum(fenzi1,fenmu1) + " / " + formatNum(fenzi2,fenmu2) + " = " + formatNum(fenzi1*fenmu2,fenmu1*fenzi2);
System.out.println(divide);
}
}
public static String formatNum(int fenzi,int fenmu){
if(fenzi == 0){
return "0";
}
if(fenmu == 0){
return "Inf";
}
boolean isNegative = false;
if(fenzi < 0 && fenmu > 0){
fenzi = 0 - fenzi;
isNegative = true;
}else if(fenzi > 0 && fenmu < 0){
fenmu = 0 - fenmu;
isNegative = true;
}
if(fenzi % fenmu == 0){
if(isNegative){
return "(-" + fenzi/fenmu + ")";
}
return fenzi/fenmu + "";
}else{
int shang = fenzi/fenmu;
int yushu = fenzi%fenmu;
int gongyueshu = getMaxGongyueshu(fenmu,yushu);
String fenshu = yushu/gongyueshu + "/" + fenmu/gongyueshu;
String res = "";
if(shang > 0){
res = shang + " " + fenshu;
}else{
res = fenshu;
}
if(isNegative){
res = "(-" + res + ")";
}
return res;
}
}
public static int getMaxGongyueshu(int m,int n){
if(m < n){
int t = m;
m = n;
n = t;
}
if (m % n == 0) {// 若余数为0,返回最大公约数
return n;
} else { // 否则,进行递归,把n赋给m,把余数赋给n
return getMaxGongyueshu(n, m % n);
}
}
}