一.代码
package Main01;
public class Rational {
private long numerator = 0;//分子
private long denominator = 1;//分母
public Rational() { //构建函数
this(0, 1);
}
public Rational(long numerator, long denominator) {
long gcd = gcd(numerator, denominator);
this.numerator = ((denominator > 0) ? 1 : -1) * numerator / gcd;
this.denominator = Math.abs(denominator) / gcd;
}
private long gcd(long n, long d) {
long n1 = Math.abs(n);
long n2 = Math.abs(d);
int gcd = 1;
for (int k = 1; k <= n1 && k <= n2; k++) {
if (n1 % k == 0 && n2 % k == 0) {
gcd = k;
}
}
return gcd;
}
public long getNumerator() {
return numerator;
}
public long getDenominator() {
return denominator;
}
public Rational add(Rational secondRational) { // 相加
long n = numerator * secondRational.getDenominator() + denominator * secondRational.getNumerator();
long d = denominator * secondRational.getDenominator();
return new Rational(n, d);
}
public Rational subtract(Rational secondRational) { // 相减
long n = numerator * secondRational.getDenominator() - denominator * secondRational.getNumerator();
long d = denominator * secondRational.getDenominator();
return new Rational(n, d);
}
public Rational mulitiply(Rational secondRational) { // 相乘
long n = numerator * secondRational.getNumerator();
long d = denominator * secondRational.getDenominator();
return new Rational(n, d);
}
public Rational divide(Rational secondRational) { // 相除
long n = numerator * secondRational.getDenominator();
long d = denominator * secondRational.numerator;
return new Rational(n, d);
}
public String toString() {
if(denominator == 1) {
return numerator+"";
}
else {
return numerator+"/"+denominator;
}
}
}
二.测试代码
package cn.goktech;
import Main01.Rational;
public class Text01 {
//
public static void main(String[] args) {
Rational r1 = new Rational(1, 3);
Rational r2 = new Rational(1, 2);
System.out.println("r1+r2 = " + r1.add(r2).toString());
System.out.println("r1-r2 = " + r1.subtract(r2).toString());
System.out.println("r1*r2 = " + r1.mulitiply(r2).toString());
System.out.println("r1/r2 = " + r1.divide(r2).toString());
}
}
三.运行截图
![](https://img2020.cnblogs.com/blog/1826386/202010/1826386-20201004214723661-1599525138.png)
四.疑难问题和解决方法
1.尝试描述怎么与c语言的有理数代码相比较,为什么你设计的类更加面向对象?
答:c语言相比java更加面向过程,需要你自己思考一个函数来完成它。而java是对类的编写,可以直接进行调用。
2.别人如何复用你的代码?
答:导入自己编写的有理数的包
3.别人的代码是否依赖你的有理数类的属性?当你的有理数类的属性修改时,是否会影响他人调用你有理数类的代码?
答:依赖;不会影响。
4.有理数类的public方法是否设置合适?为什么有的方法设置为private?
答:合适,因为private是私有的而puclic是公有的,并且private只可在该类中使用,可以保护一些重要的的代码不被篡改