【每日蓝桥】5、一三年省赛Java组真题“有理数类”

你好呀,我是灰小猿,一个超会写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;
		}
	}

}

输出样例:

其中有不足或者改进的地方,还希望小伙伴留言提出,一起学习!

感兴趣的小伙伴可以关注专栏!

灰小猿陪你一起进步!

最后,我正在参加2020年度博客之星的评选,求小伙伴们帮忙投票支持一下哟!

投票链接:https://bss.csdn.net/m/topic/blog_star2020/detail?username=weixin_44985880

猜你喜欢

转载自blog.csdn.net/weixin_44985880/article/details/112602785