标题:奇怪的分式

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

1/4 乘以 8/5

小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45

【2014省赛试题】奇怪的分式(递归求公约数)_i++

老师刚想批评他,转念一想,这个答案凑巧也对啊,真是见鬼!
对于分子、分母都是1~9中的一位数的情况,还有哪些算式可以这样计算呢?
请写出所有不同算式的个数(包括题中举例的)。

  • 显然,交换分子分母后,例如:4/1乘以5/8是满足要求的,这算做不同的算式。
  • 但对于分子分母相同的情况,2/2乘以3/3这样的类型太多了,不在计数之列!

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

public class Test06_奇怪的分式 {
public static void main(String[] args) {
int count = 0;
for (int i = 1; i < 10; i++) { // 左分子
for (int j = 1; j < 10; j++) { // 左分母
if (i==j) continue;
for (int k = 1; k < 10; k++) { // 右分子
for (int l = 1; l < 10; l++) { // 右分母
if (k==l) continue;

// 求最大公约数
int gcd1 = gcd(i*k,j*l);
int gcd2 = gcd(i*10+k,j*10+l);
// 同除公约数比较值
if (i*k/gcd1 == (i*10+k)/gcd2 && j*l/gcd1==(j*10+l)/gcd2){
System.out.println(i+" "+j+" "+k+" "+l);
count++;
}
}
}
}
}
System.out.println(count); // 14
}

/**
* todo 递归求两数的最大公约数
* @param a
* @param b
* @return
*/
private static int gcd(int a, int b) {
if (b==0) return a;
return gcd(b,a%b);
}
}

递归求公约数:m % n

  • m > n 返回 余数
  • m < n 返回 m