这个例子是关于分数的加减乘除运算。
先码好基本要用到的算法。
public class Rational {
int numerator =1; //分子
int denominator=1; //分母
void setNumerator(int a) { //设置分子
int c=f(Math.abs(a),denominator); //计算最大公约数
numerator=a/c;
denominator=denominator/c;
if(numerator<0 && denominator<0) {
numerator = -numerator;
denominator = -denominator;
}
}
void setDenominator(int b) { //设置分母
int c=f(numerator,Math.abs(b)); //计算最大公约数
numerator=numerator/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) { //求a、b的最大公约数
if(a==0) return 1;
if(a<b) {
int c=a;
a=b;
b=c;
}
int r=a%b;
while(r!=0) { //不断求余数,直到最后余数为0,则最后一次的b就是最大公约数
a=b;
b=r;
r=a%b;
}
return b;
}
Rational add(Rational r) { //加法运算
int a=r.getNumerator(); //返回有理数r的分子,此处的分子是对象r引用的分子
int b=r.getDenominator(); //返回有理数r的分母
int newNumerator =numerator*b+denominator*a;//此处的numerator是原来的成员变量,计算出新分子
int newDenominator =denominator*b; //计算出新分母
Rational result =new Rational(); //声明一个result对象,用来存放结果
result.setNumerator(newNumerator); //result对象中存放新的分子分母
result.setDenominator(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();
result.setNumerator(newNumerator);
result.setDenominator(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();
result.setNumerator(newNumerator);
result.setDenominator(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();
result.setNumerator(newNumerator);
result.setDenominator(newDenominator);
return result;
}
}
接着是主类的运算例子。
public class EX4_23 {
public static void main(String[] args) {
Rational r1=new Rational(); //创建Rational类对象r1
r1.setNumerator(1); //r1设置分子1
r1.setDenominator(5); //r1设置分母5
Rational r2=new Rational();
r2.setNumerator(3);
r2.setDenominator(2);
Rational result=r1.add(r2);
int a=result.getNumerator();
int b=result.getDenominator();
System.out.println("1/5+3/2="+a+"/"+b);
result=r1.sub(r2);
a=result.getNumerator();
b=result.getDenominator();
System.out.println("1/5-3/2="+a+"/"+b);
result=r1.muti(r2);
a=result.getNumerator();
b=result.getDenominator();
System.out.println("1/5×3/2="+a+"/"+b);
result=r1.div(r2);
a=result.getNumerator();
b=result.getDenominator();
System.out.println("1/5÷3/2="+a+"/"+b);
int n=10,k=1;
System.out.println("计算2/1+3/2+5/3+8/5+13/8+...的前"+n+"项和.");
Rational sum=new Rational(); //用来表示求和
sum.setNumerator(0);
Rational item=new Rational(); //声明一个对象来表示分子分母的变换
item.setNumerator(2);
item.setDenominator(1);
while(k<=n) {
sum=sum.add(item);
k++;
int fenzi=item.getNumerator();
int fenmu=item.getDenominator();
item.setNumerator(fenzi+fenmu);
item.setDenominator(fenzi);
}
a=sum.getNumerator();
b=sum.getDenominator();
System.out.println("用分数表示:");
System.out.println(a+"/"+b);
double doubleResult=(a*1.0)/b;
System.out.println("用小数表示:");
System.out.println(doubleResult);
}
}
最后我将例题稍作修改,改成了可以自己输入想要的分数,以及可以自由的选择算法。
public class EX_23_1 {
public static void main(String[] args) {
Scanner in =new Scanner(System.in);
Rational r1=new Rational(); //创建Rational类对象r1
System.out.println("请输入第一个分数的分子、分母:");
int i,j,p,l;
i=in.nextInt();
j=in.nextInt();
System.out.println("请输入第二个分数的分子、分母:");
p=in.nextInt();
l=in.nextInt();
r1.setNumerator(i);
r1.setDenominator(j);
Rational r2=new Rational();
r2.setNumerator(p);
r2.setDenominator(l);
int n;
System.out.println("请选择需要执行的算法:1.加法 2.减法 3.乘法 4.除法");
n=in.nextInt();
while(n>0) {
switch(n) {
case 1:
Rational result=r1.add(r2);
int a=result.getNumerator();
int b=result.getDenominator();
System.out.println(i+"/"+j+"+"+p+"/"+l+"="+a+"/"+b);
break;
case 2:
result=r1.sub(r2);
a=result.getNumerator();
b=result.getDenominator();
System.out.println(i+"/"+j+"-"+p+"/"+l+"="+a+"/"+b);
break;
case 3:
result=r1.muti(r2);
a=result.getNumerator();
b=result.getDenominator();
System.out.println(i+"/"+j+"×"+p+"/"+l+"="+a+"/"+b);
break;
case 4:
result=r1.div(r2);
a=result.getNumerator();
b=result.getDenominator();
System.out.println(i+"/"+j+"÷"+p+"/"+l+"="+a+"/"+b);
break;
default:
System.out.println("请输入正确的数字!");
}
System.out.println("若需要计算,输入相应的数字:");
System.out.println("结束输入0");
n=in.nextInt();
}
}
}
结果如图: