分数是有理数(Rational),我们经常做分数的四则运算得到的是小数,如果我们运行分数的四则运算想要得到分数,要怎样做呢?
用类实现对有理数的封装可以做到。
有理数有两个重要的成员,即分子(numerator)和分母(denominator),另外还有重要的四则运算。
Rational类应该具有以下属性(成员变量)和功能(方法):
1.成员变量:int型变量numerator(分子)、denominator(分母)
2.方法(分数的四则运算):
(1)提供Rational add(Rational r)方法,即有理数调用该方法和参数指定的有理数做加法运算,并返回一个Rational对象。
int newNumerator=numerator*b+denominator*a;//通分后的分子运算
int newDenominator=denominator*b;//分母通分
(2)提供Rational sub(Rational r)方法,即有理数调用该方法和参数指定的有理数做减法运算,并返回一个Rational对象。
int newNumerator=numerator*b-denominator*a;//通分后的分子运算
int newDenominator=denominator*b;//分母通分
(3)提供Rational muti(Rational r)方法,即有理数调用该方法和参数指定的有理数做乘法运算,并返回一个Rational对象。
int newNumerator=numerator*a;//分子相乘
int newDenominator=denominator*b;//分母相乘
(4)提供Rational div(Rational r)方法,即有理数调用该方法和参数指定的有理数做除法运算,并返回一个Rational对象。
int newNumerator=numerator*b;//一个数除于另一个数等于一个数剩于另一个数的倒数
int newDenominator=denominator*a;
根据以上分析,给出Rational类代码如下:
Rational.java
public class Rational {
int numerator; //分子
int denominator; //分母
Rational(){
}
Rational(int a,int b){ //有参构造函数
if(a==0){
numerator=0;
denominator=0;
}
else{
setNumeratorAndDenominator(a,b);
}
}
void setNumeratorAndDenominator(int a,int b){ //设置分子和分母
int c=f(Math.abs(a),Math.abs(b)); //计算最大公约数
numerator=a/c;
denominator=b/c;
if(numerator<0&&denominator<0){
numerator=-numerator;
denominator=-denominator;
}
}
int getNumerator(){
return numerator;
}
int getDenominator(){
return denominator;
}
int f(int a,int b){ //计算最大公约数
if(a<b){
int c=a;
a=b;
b=c;
}
int r=a%b;
while(r!=0){
a=b;
b=r;
r=a%b;
}
return b;
}
Rational add(Rational r){ //加法运算
int a=r.getNumerator();
int b=r.getDenominator();
int newNumerator=numerator*b+denominator*a;
int newDenominator=denominator*b;
Rational result=new Rational(newNumerator,newDenominator);
return result;
}
Rational sub(Rational r){ //减法运算
int a=r.getNumerator();
int b=r.getDenominator();
int newNumerator=numerator*b-denominator*a;
int newDenominator=denominator*b;
Rational result=new Rational(newNumerator,newDenominator);
return result;
}
Rational muti(Rational r){ //乘法运算
int a=r.getNumerator();
int b=r.getDenominator();
int newNumerator=numerator*a;
int newDenominator=denominator*b;
Rational result=new Rational(newNumerator,newDenominator);
return result;
}
Rational div(Rational r){ //除法运算
int a=r.getNumerator();
int b=r.getDenominator();
int newNumerator=numerator*b;
int newDenominator=denominator*a;
Rational result=new Rational(newNumerator,newDenominator);
return result;
}
}
现在有了Rational类,接下来就可以让该类创建若干个对象,并让它们交互信息必要的四则运算来完成程序要达成的目的(两个或两个以上的分数进行四则运算得到分数),下面的主类MainClass只用Rational对象计算两个分数的四则运算,并计算了2/1+3/2+5/3+…的前10项的和:
MainClass.java
public class MianClass {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Rational firstRational=new Rational(2,10); //第一个分数
Rational secondRational=new Rational(10,5); //第二个分数
//加法运算
Rational resultRational=firstRational.add(secondRational); //进行加法运算
int resultNumerator=resultRational.getNumerator(); //进行加法运算后的分子
int resultDenominator=resultRational.getDenominator();//进行加法运算后的分母
System.out.println("2/10+10/5="+resultNumerator+"/"+resultDenominator);
//减法运算
resultRational=firstRational.sub(secondRational);
resultNumerator=resultRational.getNumerator();
resultDenominator=resultRational.getDenominator();
System.out.println("2/10-10/5="+resultNumerator+"/"+resultDenominator);
//乘法运算
resultRational=firstRational.muti(secondRational);
resultNumerator=resultRational.getNumerator();
resultDenominator=resultRational.getDenominator();
System.out.println("2/10*10/5="+resultNumerator+"/"+resultDenominator);
//除法运算
resultRational=firstRational.div(secondRational);
resultNumerator=resultRational.getNumerator();
resultDenominator=resultRational.getDenominator();
System.out.println("2/10÷10/5="+resultNumerator+"/"+resultDenominator);
//2/1+3/2+5/3+...的前10项的和
int k=1,n=10; //项数
System.out.println("计算2/1+3/2+5/3+...的前"+n+"项的和:");
Rational sum=new Rational(0,1);//和,初始为0
Rational item=new Rational(2,1);//项值,首项为2/1
while(k<=n){
sum=sum.add(item);
k++;
int prevNumerator=item.getNumerator();
int prevDenominator=item.getDenominator();
item=new Rational(prevNumerator+prevDenominator,prevNumerator);
}
resultNumerator=sum.getNumerator();
resultDenominator=sum.getDenominator();
System.out.println("用分数表示:"+resultNumerator+"/"+resultDenominator);
double doubleResult=(resultNumerator*1.0)/resultDenominator;
System.out.println("用小数表示:"+doubleResult);
}
}
运行结果为:
(整理自Java面向对象程序设计第2版)