Algs4-1.2.16有理数

1.2.16有理数。为有理数实现一个可变数据类型Rational,支持加减乘除操作。无需测试溢出(请见练习1.2.17),只需使用两个long型实例变量表示分子和分母来控制溢出的可能性。使用欧几里得算法来保证分子和分母没有公因子。编写一个测试用例检测你实现的所有方法。
public class Rational
Rational(int numerator. int denominator)
Rational plus(Rational b) 该数与b之和
Rational minus(Rational b) 该数与b之差
Rational times(Rational b) 该数与b之积
Rational divides(Rational b) 该数与b之商
boolean equals(Rational that) 该数与that相等吗
String toString() 对象的字符串表示
答:

public class Rational
{
   private final long myNumerator;
   private final long myDenominator;
 
   private long gcd(long p,long q)
   {
       if (q==0) return p;
       return gcd(q,p%q);
   }
 
   public Rational(long numerator, long denominator)
    {
       long gcdValue=gcd(numerator,denominator);
       myNumerator=numerator/gcdValue;
       myDenominator=denominator/gcdValue;
    }
  
   public long Numberator()
   {
       return myNumerator;
   }
 
   public long Denominator()
   {
       return myDenominator;
   }
 
    public Rational plus(Rational b)
    {
        long gcdValue=gcd(this.Denominator(),b.Denominator());
        long n=this.Numberator()*b.Denominator()/gcdValue+b.Numberator()*this.Denominator()/gcdValue;
        long d=this.Denominator()*b.Denominator()/gcdValue;
        //
        gcdValue=gcd(d,n);
        n=n/gcdValue;
        d=d/gcdValue;
        return new Rational(n,d);
     }
  
     public Rational minus(Rational b)
    {
        long gcdValue=gcd(this.Denominator(),b.Denominator());
        long n=this.Numberator()*b.Denominator()/gcdValue-b.Numberator()*this.Denominator()/gcdValue;
        long d=this.Denominator()*b.Denominator()/gcdValue;
        //
        gcdValue=gcd(d,n);
        n=n/gcdValue;
        d=d/gcdValue;
        return new Rational(n,d);
     }
   
      public Rational times(Rational b)
    {
        long gcdValue1=gcd(this.Numberator(),b.Denominator());
        long gcdValue2=gcd(this.Denominator(),b.Numberator());
        //
        long n=this.Numberator()/gcdValue1*b.Numberator()/gcdValue2;
        long d=this.Denominator()/gcdValue2*b.Denominator()/gcdValue1;
        return new Rational(n,d);
     }
  
      public Rational divides(Rational b)
    {
        long gcdValue1=gcd(this.Numberator(),b.Numberator());
        long gcdValue2=gcd(this.Denominator(),b.Denominator());
        //
        long n=this.Numberator()/gcdValue1*b.Denominator()/gcdValue2;
        long d=this.Denominator()/gcdValue2*b.Numberator()/gcdValue1;
        return new Rational(n,d);
     }

public boolean equals(Rational that)
    {
        if(this==that) return true;
        if(that==null) return false;
        if(this.Numberator()!=that.Numberator()) return false;
        if(this.Denominator()!=that.Denominator()) return false;
        return true;
    }

public String toString()
    {
        return this.Numberator()+"/"+this.Denominator();
     }
  
    public static void main(String[] args)
    {
        long Numberator=Long.parseLong(args[0]);
        long Denominator=Long.parseLong(args[1]);
    
        Rational r1=new Rational(Numberator,Denominator);
        Rational r2=new Rational(Numberator,Denominator);
        //=
        StdOut.printf("r1=%-7s r2=%-7s r1=rs2 is:%s\n",r1.toString(),r2.toString(),r1.equals(r2));
        //+
        StdOut.printf("r1=%-7s r2=%-7s r1+rs2=%-7s\n",r1.toString(),r2.toString(),r1.plus(r2));
        //-
        StdOut.printf("r1=%-7s r2=%-7s r1-rs2=%-7s\n",r1.toString(),r2.toString(),r1.minus(r2));
        //*
        StdOut.printf("r1=%-7s r2=%-7s r1*rs2=%-7s\n",r1.toString(),r2.toString(),r1.times(r2));
        // /
        StdOut.printf("r1=%-7s r2=%-7s r1/rs2=%-7s\n",r1.toString(),r2.toString(),r1.divides(r2));
      
    }
}

原文地址:https://www.cnblogs.com/longjin2018/p/9848929.html

时间: 2024-11-02 21:59:06

Algs4-1.2.16有理数的相关文章

1.2 数据抽象

练习 1.2.1 编写一个Point2D的用例,从命令行接受一个整数N.在单位正方形中生成N个随机点,然后计算两点之间的最近距离.       /*查阅Point2D的API*/ public class H1_2_01 { public static void main(String[] args) { int N=1000; Point2D[] arr=new Point2D[N]; for(int i=0;i<N;i++) arr[i]=new Point2D(Math.random(),

便是见到前方那

以可得量力而凌厉刀芒横扫http://weibo.com/2015.09.16/p/1001603887144312655250http://weibo.com/2015.09.16/p/1001603887144321088567http://weibo.com/2015.09.16/p/1001603887144325238274http://weibo.com/2015.09.16/p/1001603887144325282921http://weibo.com/2015.09.16/p/

对于这黑马之会

是想不出究竟还只是区区一角啊http://weibo.com/2015-09.16/p/1001603887574727917787http://weibo.com/2015-09.16/p/1001603887574727946828http://weibo.com/2015-09.16/p/1001603887574732112097http://weibo.com/2015-09.16/p/1001603887574732112103http://weibo.com/2015-09.16/

结构-05. 有理数均值(20)

本题要求编写程序,计算N个有理数的平均值. 输入格式: 输入第1行给出正整数N(<=100):第2行中按照“a1/b1 a2/b2 ……”的格式给出N个分数形式的有理数,其中分子和分母全是整形范围内的整数:如果是负数,则负号一定出现在最前面. 输出格式: 在一行中按照“a/b”的格式输出N个有理数的平均值.注意必须是该有理数的最简分数形式,若分母为1,则只输出分子. 输入样例1: 4 1/2 1/6 3/6 -5/10 输出样例1: 1/6 输入样例2: 2 4/3 2/3 输出样例2: 1 1

结构-01. 有理数比较

结构-01. 有理数比较(10) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 乔林(清华大学) 本题要求编写程序,比较两个有理数的大小. 输入格式: 输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整形范围内的正整数. 输出格式: 在一行中按照“a1/b1 关系符 a2/b2”的格式输出两个有理数的关系.其中“>”表示“大于”,“<”表示“小于”,“=”表示“等于”. 输入样例1:

*结构-05. 有理数均值

1 /* 2 * Main.c 3 * F5-结构-05. 有理数均值 4 * Created on: 2014年8月26日 5 * Author: Boomkeeper 6 *********部分通过*浮点错误****** 7 */ 8 9 #include <stdio.h> 10 /** 11 * 有理数结构体 12 */ 13 struct rational { 14 int numerator; 15 int denominator; 16 }; 17 /** 18 * 最大公约数

结构-02. 有理数加法

1 /* 2 * Main.c 3 * F2-结构-02. 有理数加法 4 * Created on: 2014年8月25日 5 ********测试通过********* 6 */ 7 8 #include <stdio.h> 9 /** 10 * 有理数结构体 11 */ 12 struct rationalNumber{ 13 int numerator; 14 int denominator; 15 }; 16 /** 17 * 最大公约数 18 */ 19 int greatComm

PAT乙级1034. 有理数四则运算(20)

本题要求编写程序,计算2个有理数的和.差.积.商. 输入格式: 输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为0. 输出格式: 分别在4行中按照“有理数1 运算符 有理数2 = 结果”的格式顺序输出2个有理数的和.差.积.商.注意输出的每个有理数必须是该有理数的最简形式“k a/b”,其中k是整数部分,a/b是最简分数部分:若为负数,则须加括号:若除法分母为0,则输出“Inf”.题目保证正确的输出中没

有理数分解-数论

题目描述 Description 任何一个[0,1]中的有理数p/q(p.q均为自然数)一定可以分解成1/r1+1/r2+1/r3+-+1/rk,且r1<r2<r3<-<rk.当然这样的分解不是唯一的,如5/6=1/2+1/3=1/2+1/5+1/8+1/120,第一个分解式中的第二项比第二个分解式中的第二项大,因此我们可以定义第一个分解式比第二个分解式大. 程序要求找出p/q的最大分解式. 输入输出格式 Input/output 输入格式:键盘输入p.q,1≤p≤q≤50 输出格