分数运算(其中有几个算法不错)
2011-06-03 10:23 Rollen Holt 阅读(1234) 评论(0) 编辑 收藏 举报//测试类 //范例1-3 支持查找功能的分数类 7 //∷相关函数:compareTo函数 public class Exec2 { public static void main(String[] args) { // 创建两个分数类变量 Fraction fraction1 = new Fraction(0.25); Fraction fraction2 = new Fraction(2, 8); // 分数相加 Fraction fraction3 = fraction1.add(fraction2); System.out.println(fraction1 + "+" + fraction2 + "=" + fraction3); // 创建含有5个元素的分数类变量数组 Fraction[] fractions = { new Fraction(1, 3), new Fraction(1, 5), new Fraction(1, 2), new Fraction(1, 4), new Fraction(1, 10) }; // 对数组排序,并使用二分折半查找方法来搜索指定分数类变量 java.util.Arrays.sort(fractions); // 输出命中类变量的下标位置 System.out.println("搜索的分数是第" + java.util.Arrays.binarySearch(fractions, fraction3) + "个!"); } } // 支持查找功能的分数类 class Fraction implements Comparable { // 分子 private int numerator; // 分母 private int denominator; // 默认构造函数 public Fraction() { } // 该构造函数对分子和分母进行初始化 public Fraction(int n, int d) { setFraction(n, d); } // 该构造函数支持将双精度数转换为相应的分数 public Fraction(double d) { convertToFraction(d); } // 该函数可以将双精度数转换为相应的分数 private void convertToFraction(double d) { int decimalCount = 1; // 求双精度数的字符长度 int dLen = String.valueOf(d).length(); // 不断的将双精度数累乘10,直至转换为整数为止 for (int i = 0; i < dLen; i++) { d = d * 10; decimalCount *= 10; } // 分子为最终的整数乘积结果 numerator = (int) d; // 分母为10的累乘结果 denominator = decimalCount; // 约分 reduct(); } // 分子的设置函数,并且约分 public void setNumerator(int n) { numerator = n; reduct(); } // 分子的读取函数 public int getNumerator() { return numerator; } // 分母的设置函数,并且约分 public void setDenominator(int d) { // 检查分母是否为0 if (d == 0) denominator = 1; //建议采用异常 else denominator = d; reduct(); } // 分母的读取函数 public int getDenominator() { return denominator; } // 分数的设置函数,并且约分 public void setFraction(int n, int d) { setNumerator(n); setDenominator(d); reduct(); } // 格式化字符信息输出 public String toString() { // 如果为负分数,则将负号提前显示,分子和分母保留为正数,否则分子和分母皆取正数 if (numerator * denominator < 0) return "-" + Math.abs(numerator) + "/" + Math.abs(denominator); else return Math.abs(numerator) + "/" + Math.abs(denominator); } // 利用对应小数值是否相同来判断分数是否相同 public boolean equals(Fraction f) { if (numerator == f.numerator && denominator == f.denominator) return true; else return false; } // 利用对应小数值的大小来判断分数的大小 public boolean isGreater(Fraction f) { if ((double) numerator / denominator > (double) f.numerator / f.denominator) return true; else return false; } // 约分函数 private void reduct() { // 求分子和分母的最小值 int minValue = Math.min(Math.abs(numerator), Math.abs(denominator)); // 将小于分子和分母的最小值的数值,从大到小去除分子和分母,如果能够同时被整除,则以此数值约分并退出 for (int i = minValue; i >= 1; i--) { if (numerator % i == 0 && denominator % i == 0) { numerator = numerator / i; denominator = denominator / i; break; } } } // 返回分数相加的结果,并且约分 public Fraction add(Fraction f) { Fraction fraction = new Fraction(); fraction.numerator = numerator * f.denominator + f.numerator * denominator; fraction.denominator = denominator * f.denominator; fraction.reduct(); return fraction; } // 返回分数相减的结果,并且约分 public Fraction minus(Fraction f) { Fraction fraction = new Fraction(); fraction.numerator = numerator * f.denominator - f.numerator * denominator; fraction.denominator = denominator * f.denominator; fraction.reduct(); return fraction; } // 返回分数相乘的结果,并且约分 public Fraction multiply(Fraction f) { Fraction fraction = new Fraction(); fraction.numerator = numerator * f.numerator; fraction.denominator = denominator * f.denominator; fraction.reduct(); return fraction; } // 返回分数相除的结果,并且约分 public Fraction divide(Fraction f) { Fraction fraction = new Fraction(); fraction.numerator = numerator * f.denominator; fraction.denominator = denominator * f.numerator; fraction.reduct(); return fraction; } // 支持两个分数类变量的比较,以实现分数集合的查找功能 public int compareTo(Object o) { Fraction f = (Fraction) o; // 利用对应小数的大小来比较分数的大小 if ((double) numerator / denominator > (double) f.numerator / f.denominator) return 1; else if ((double) numerator / denominator < (double) f.numerator / f.denominator) return -1; else return 0; } // 根据对应小数是否相同来判断分数是否相同 public boolean equals(Object obj) { Fraction f = (Fraction) obj; if (Math.abs((double) numerator / denominator - (double) f.numerator / f.denominator) < 0.00001) return true; return false; } // 相同数值的分数返回相同的哈希码 public int hashcode() { String str = String.valueOf((double) numerator / denominator); return str.hashCode(); } }
==============================================================================
本博客已经废弃,不在维护。新博客地址:http://wenchao.ren
我喜欢程序员,他们单纯、固执、容易体会到成就感;面对压力,能够挑灯夜战不眠不休;面对困难,能够迎难而上挑战自我。他
们也会感到困惑与傍徨,但每个程序员的心中都有一个比尔盖茨或是乔布斯的梦想“用智慧开创属于自己的事业”。我想说的是,其
实我是一个程序员
==============================================================================