【每日蓝桥】22、一四年省赛Java组真题“奇怪的分式”

你好呀,我是灰小猿,一个超会写bug的程序猿!

欢迎大家关注我的专栏“每日蓝桥”,该专栏的主要作用是和大家分享近几年蓝桥杯省赛及决赛等真题,解析其中存在的算法思想、数据结构等内容,帮助大家学习到更多的知识和技术!

标题:奇怪的分式

上小学的时候,小明经常自己发明新的算法,一次,老师出的题目是:

1/4 乘以 8/5

小明居然把分子拼接在一起,把分母拼接在一起,答案是:18/45  (参见图1.png)

老师刚想批评,转念一想,这个答案凑巧也对啊,真是见鬼!

对于分子、分母都是1~9中的一位数的情况,还有哪些算式可以这样计算呢?

请写出所有不同算式的个数(包括题中举例的)

显然,交换分子分母后,例如:4/1乘以5/8是满足要求的,这算做不同的算式

但对于分子分母相同的情况,2/2 乘以 3/3这样的类型太多了,不在计数之列!

注意:答案是个整数,(考虑对称性,肯定是偶数),请通过浏览器提交,不要书写多余的内容。

解题思路:

本题在计算中主要就是用到了四个for循环,假设两个算式分别是a/b 和 c/d

那么我们要把a、b、c、d所有的可能全部都枚举出来,然后根据题目中的要求,我们应该即将结果得到的两个分式进行约分,看约分后两个数是否相等。

主要用到的方法就是求两个数的最大公约数和分数的约分比较

答案源码:

public class Year2014_Bt6 {

	public static void main(String[] args) {
		int ans = 0;
		for (int a = 1; a < 10; a++) {
			for (int b = 1; b < 10; b++) {
				for (int c = 1; c < 10; c++) {
					for (int d = 1; d < 10 ; d++) {
						if (a==b&&c==d) {
							continue;
						}
						int gcd1 = gcd(a*c, b*d);
						int gcd2 = gcd(a*10+c, b*10+d);
						if ((a*c)/gcd1 == (a*10+c)/gcd2&&(b*d)/gcd1 == (b*10+d)/gcd2) {
							ans++;
						}
					}
				}
				
			}
			
		}
		System.out.println(ans);
	}
	
	/**
	 * 求两个数的最大公约数
	 * */
	static public int gcd(int a,int b) {
		if (a%b==0) {
			return b;
		}
		return gcd(b, a%b);
	}
		
}

输出样例:

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

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

灰小猿陪你一起进步!

猜你喜欢

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