奇怪的分式(枚举 + 判断)

1. 问题描述:

上小学的时候,小明经常自己发明新算法。一次,老师出的题目是:1/4 乘以 8/5 ,小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见下图)

 

老师刚想批评他,转念一想,这个答案凑巧也对啊,真是见鬼!对于分子、分母都是 1~9 中的一位数的情况,还有哪些算式可以这样计算呢?请写出所有不同算式的个数(包括题中举例的)。显然,交换分子分母后,例如:4/1 乘以 5/8 是满足要求的,这算做不同的算式。但对于分子分母相同的情况,2/2 乘以 3/3 这样的类型太多了,不在计数之列!

注意:答案是个整数(考虑对称性,肯定是偶数)。请通过浏览器提交

2. 思路分析:

① 仔细阅读以下题目知道我们可以使用枚举加上判断的方法来求出这样的分式,因为有四个变量所以使用四层循环就可以了,并且a不能够与b相等,c不能够与d相等,这两个条件在循环的过程中简单判断一下就好了,然后求解出分子与分子相乘与分子与分母相乘之后两者的最大公约数,然后对于两个数字合起来的也是一样也是求解出分子与分母合起来之后的最大公约数,把求得的结果除以各自的最大公约数,对分子分母判断约分之后的结果是否相等即可

② 题目考我们的就是要求解出两个数字的最大公约数的问题,这里可以使用递归的解法来进行求解,在求解出满足题目要求的答案之后我们可以进行输出一下检验一下答案是否正确

public class Main {
	static int count = 0;
	public static void main(String[] args) {
		for(int a = 1; a < 10; a++){
			for(int b = 1; b < 10; b++){
				if(a == b) continue;
				for(int c = 1; c < 10; c++){
					for(int d = 1; d < 10; d++){
						if(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)){
							count++;
							//System.out.printf("%d %d %d %d\n", a, b, c, d);
						}
					}
				}
			}
		}
		System.out.println(count);
	}

	//求解最大公约数
	private static int gcd(int m, int n) {
		if(n == 0)return m;
		return gcd(n, m % n);
	}
}

猜你喜欢

转载自blog.csdn.net/qq_39445165/article/details/88617895