-------------------------------------------------------------------------------------------------
时间限制:1秒 空间限制:32768K 代码长度限制 100 KB
-------------------------------------------------------------------------------------------------
题目描述:
计算机中采用浮点数表示所有实数,但这意味着精度丢失。例如无法精确表示“1/3”。
NowCoder最近要处理很多金融问题,这些账目不允许出现精度丢失,因为差之
毫厘谬之千里。你能帮他实现一套分数的计算器吗?
输入描述:
输入包含多组数据。
每组数据一行,包含两个分数和一个运算符,中间用空格隔开。
其中分子与分母均为不大于30的正整数。
输出描述:
对应每一组数据,输出两个分数的计算结果。
要求输出最简分数,即分子与分母互质。
输入例子:
1/3 2/3 + 1/5 1/4 - 1/2 1/3 * 2/3 4/3 /
输出例子:
1/1
-1/20
1/6
1/2
------------------------------------------------------------------------------------------------
实现思路:
(1).将数字转换为分数; (2).根据分数运算规则进行计算即可; (3).最后需要对运算结果转换为最简分数;
------------------------------------------------------------------------------------------------
package com.biyao.algorithm.niuke.a2;
import java.util.Scanner;
public class Main_a2_012 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while(scan.hasNext()){
String num1 = scan.next();
String num2 = scan.next();
String symbol = 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]);
switch (symbol) {
case "+":
String add = formatNum(fenzi1*fenmu2+fenzi2*fenmu1,fenmu1*fenmu2);
System.out.println(add);
break;
case "-":
int fz = fenzi1*fenmu2-fenzi2*fenmu1;
int fm = fenmu1*fenmu2;
if(fz < 0){
System.out.print("-");
fz = 0 - fz;
}
String subtract = formatNum(fz,fm);
System.out.println(subtract);
break;
case "*":
String multiply = formatNum(fenzi1*fenzi2,fenmu1*fenmu2);
System.out.println(multiply);
break;
case "/":
String divide = formatNum(fenzi1*fenmu2,fenmu1*fenzi2);
System.out.println(divide);
break;
default:
break;
}
}
}
public static String formatNum(int fenzi,int fenmu){
int gongyueshu = getMaxGongyueshu(fenzi,fenmu);
if(gongyueshu == 1){
return fenzi + "/" + fenmu;
}
String fenshu = fenzi/gongyueshu + "/" + fenmu/gongyueshu;
return fenshu;
}
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);
}
}
}