既约分数
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
如果一个分数的分子和分母的最大公约数是 1
,这个分数称为既约分数。
例如3/4
,1/8
,7/1
, 都是既约分数。
请问,有多少个既约分数,分子和分母都是 1
到 2020
之间的整数(包括 1
和 2020
)?
运行限制
- 最大运行时间:2s
- 最大运行内存: 128M
记录题解
package com.xiang.lanqiao;
/**
* @author snape
* @create 2022-04-02 19:18
*/
public class BothAboutTheScore {
/**
* 最优方法:把辗转相除法和更相减损术的优势结合起来,在更相减损术的基础上 使用移位运算。
* 在代码中,判断整数奇偶性的⽅式是让整数和1进⾏与运算,如果
* (a&1)==0,则说明整数a是偶数;如果(a&1)!=0,则说明整数a是奇数。
* @param a
* @param b
* @return
*/
public static int gcd(int a, int b) {
if (a == b) {
return a;
}
if ((a & 1) == 0 && (b & 1) == 0) {
return gcd(a >> 1, b >> 1) << 1;
} else if ((a & 1) == 0 && (b & 1) != 0) {
return gcd(a >> 1, b);
} else if ((a & 1) != 0 && (b & 1) == 0) {
return gcd(a, b >> 1);
} else {
int big = a > b ? a : b;
int small = a < b ? a : b;
return gcd(big - small, small);
}
}
public static void main(String[] args) {
int count = 0;
for (int i = 1; i <= 2020; i++) {
for (int j = 1; j <= 2020; j++) {
if (gcd(i,j) == 1){
count++;
}
}
}
System.out.println(count);//2481215
}
}