package com.lovo;
/**
* 分数类
* @author 李睿
*
*/
public class Fraction {
private int numerator; //分子
private int denominator; //分母
/**
* 构造器
* @param numerator 分子
* @param denominator 分母
*/
public Fraction(int numerator, int denominator) {
this.numerator = numerator;
this.denominator = denominator;
normalize();
}
/**
* 让分数以字符串的形式接收进来
* @param str
*/
public Fraction(String str){
//以“/”为界限进行拆分分子和分母
String s1 = str.split("/")[0]; //“/”之前的内容
String s2 = str.split("/")[1]; //“/”之后的内容
//字符串转int型
numerator = Integer.parseInt(s1);
denominator = Integer.parseInt(s2);
normalize();
}
/**
* 小数类输入
* @param x
*/
public Fraction(double x){
numerator = (int) (x * 1000);
denominator = 1000;
simplify();
normalize();
}
/**
* 加法
* @param other 另一个分数
* @return
*
* 访问修饰符 返回类型 方法名(参数列表){。。。}
* public Fraction add (Fraction other)
* 公开 相加结果还是分数 另一个分数
*/
public Fraction add(Fraction other){
return new Fraction(numerator * other.denominator + denominator * other.numerator, denominator * other.denominator).normalize();
}
/**
* 减法
* @param other
* @return
*/
public Fraction subtract(Fraction other){
return new Fraction(numerator * other.denominator - denominator * other.numerator, denominator * other.denominator).normalize();
}
/**
* 乘法
* @param other
* @return
*/
public Fraction multiply(Fraction other){
return new Fraction(numerator * other.numerator, denominator * other.denominator).normalize();
}
/**
* 除法
* @param other
* @return
*/
public Fraction divide(Fraction other){
return new Fraction(numerator * other.denominator, denominator * other.numerator).normalize();
}
/**
* 打印时自动回调用此方法输出格式
*/
public String toString(){
// 判断分母是否为1 为1 不输出分母
return numerator + (denominator != 1?("/" + denominator):"");
}
/**
* 分数的正规化操作(正负问题,以及负号位置,分子为0情况)
* @return 正规化后的分数
*/
public Fraction normalize(){
if (numerator == 0){
denominator = 1;
}
else if (denominator < 0){
numerator = - numerator;
denominator = - denominator;
}
return this;
}
/**
* 分数的化简
* @return 化简后的分数
*/
public Fraction simplify(){
if (numerator != 0){
int divisor = gcd(Math.abs(numerator),Math.abs(denominator));
numerator /= divisor;
denominator /= divisor;
}
return this;
}
/**
* 找最大公约数
* @param numerator
* @param denominator
* @return
*/
public int gcd(int numerator, int denominator){
if (numerator > denominator){
return gcd(denominator, numerator);
// int temp = numerator;
// numerator = denominator;
// denominator = temp;
}
for(int i = numerator; i > 1; i--){
if (numerator % i == 0 && denominator % i == 0){
return i;
}
}
return 1;
}
}
分数类
最新推荐文章于 2023-06-18 15:11:57 发布