这个题本质就是在0-2020寻找最大公约数是1的两个数
求两个数最大公约数要用到欧几里得算法
欧几里得算法:
两个数的最大公约数 = 较小的数 % (较大的数 除以 较小的数 的余数),一直除,直到最后余数为0,最后那个余数就是最大公约数
举例:
求24和18的最大公约数:
24除以18 = 1...6 18除以6 = 3....0 所以最大公约数是6
求48和18的最大公约数:
48除以18 = 2...12 18除以12 = 1...6 12除以6 = 2...0 所以最大公约数是6
其中运用到了辗转相除法:
1,大的数除以小的数
2,得到余数
3,把原来的小数当作新的大数,把余数当作新的小数
4,重复除
5,直到余数 = 0 ,最后的除数就是答案
代码奉上:
java
public class Main {
public static void main(String[] args) {
int mol = 0;//分子
int den = 0;//分母
int res = 0;//最终找到的个数
for(int i = 1 ; i <= 2020 ; i++){//找分子
for(int j = 1 ; j <= 2020 ; j++){//找分母
if(getGCD(i,j) == 1){
res++;
}
}
}
System.out.println(res);
}
public static int getGCD(int a ,int b){//欧几里得算法找最大公约数
a = Math.abs(a);
b = Math.abs(b);
while( b != 0){
int temp = b;
b = a % b;//让b成为余数,余数成为下一个新的小数
a = temp;//让较小的数,也就是原先的变成新的大数
}
return a;
}
}
注意,欧几里得算法不需要判断两个数哪个大,直接进行取模运算就能够自动处理
举例:
18和24:
18%24=18 --> 24%18