分数运算(其中有几个算法不错)
2011-06-03 10:23 Rollen Holt 阅读(1249) 评论(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
我喜欢程序员,他们单纯、固执、容易体会到成就感;面对压力,能够挑灯夜战不眠不休;面对困难,能够迎难而上挑战自我。他
们也会感到困惑与傍徨,但每个程序员的心中都有一个比尔盖茨或是乔布斯的梦想“用智慧开创属于自己的事业”。我想说的是,其
实我是一个程序员
==============================================================================
浙公网安备 33010602011771号