/*
* Copyright (c) 2013, 烟台大学计算机学院
* All rights reserved.
* 文件名称: eg22-rational——分数的四则运算
* 作 者:孙红蕾
* 完成日期:2013 年 10 月 13 日
* 问题描述:对分数进行四则运算,且运算结果仍为分数。
* 输入描述: 无
* 程序输出: 显示运算结果,且分别用分数,小数表示。
* 算法设计:略
*/
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Rational r1=new Rational();
r1.setNumerator(1);
r1.setDenominator(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 Rational {
int numerator; //分子
int denominator; //分母
//设置分子
void setNumerator(int a){
int c=fac(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=fac(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;
}
//求a,b的最大公约数
int fac(int a,int b){
if(a==0){
return 1;
}
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();
result.setNumerator(newNumerator);
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;
}
}