你好呀,我是灰小猿,一个超会写bug的程序猿!
欢迎大家关注我的专栏“每日蓝桥”,该专栏的主要作用是和大家分享近几年蓝桥杯省赛及决赛等真题,解析其中存在的算法思想、数据结构等内容,帮助大家学习到更多的知识和技术!
标题:有理数类
有理数就是可以表示为两个整数的比值的数字,一般情况下,我们用近似的小数表示,但有些时候不允许出现误差,必须用两个整数来表示,这时我们可以建立一个“有理数类”,下面的代码初步的实现了这个目标,为了简明,它只提供了加法和乘法运算。
static class Rotional{ private long ra; private long rb; public Rotional(long a,long b) { ra = a; rb = b; long k = gcd(ra, rb); //获得最大公约数 if (k>1) { //如果k大于1,则说明需要约分 ra /= k; rb /= k; } } /** * 求最大公约数 * */ private long gcd(long a,long b) { if (b==0) { return a; } return gcd(b, a%b); } /** * 加法 * */ public Rotional add(Rotional x) { return ________________________________; //填空位置 } /** * 乘法 * */ public Rotional mul(Rotional x) { return new Rotional(ra*x.ra, rb*x.rb); } @Override public String toString() { if (rb==1) { return "" + ra; } return ra + "/" + rb; } }
使用该类的示例:
Rotional a = new Rotional(1, 3);
Rotional b = new Rotional(1, 6);
Rotional c = a.add(b);
System.out.println(a + "+" + b + "=" + c);
请分析代码逻辑,并推测划线处的代码,通过网页提交
注意:仅把缺少的代码作为答案,千万不要填写多余的代码、符号或者说明文字!!!
解题思路:
本题在解题上的关键就是通读题干中的源码,理解每一行所要实现的具体功能,之后了解该程序设计的主要思路,根据题干中的要求把空白处补全就可以了,
在这一题中主要考察的内容其实是Java中的面向对象的思想,采用面向对象的设计方法,实现两个分数之间的加法和乘法运算,而且题目中还已经给出了乘法的计算过程可以参考。所以我们通过对代码的理解,就可以得出加法相应的运算过程。
完整源码:
package 一三年省赛真题; public class Year2013_t5 { public static void main(String[] args) { Rotional a = new Rotional(1, 3); Rotional b = new Rotional(1, 6); Rotional c = a.add(b); System.out.println(a + "+" + b + "=" + c); } static class Rotional{ private long ra; private long rb; public Rotional(long a,long b) { ra = a; rb = b; long k = gcd(ra, rb); //获得最大公约数 if (k>1) { //如果k大于1,则说明需要约分 ra /= k; rb /= k; } } /** * 求最大公约数 * */ private long gcd(long a,long b) { if (b==0) { return a; } return gcd(b, a%b); } /** * 加法 * */ public Rotional add(Rotional x) { return new Rotional(this.ra*x.rb + x.ra*this.rb, this.rb*x.rb); //填空位置 } /** * 乘法 * */ public Rotional mul(Rotional x) { return new Rotional(ra*x.ra, rb*x.rb); } @Override public String toString() { if (rb==1) { return "" + ra; } return ra + "/" + rb; } } }
输出样例: