P593 既约分数

这个题本质就是在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

相关推荐
Mortalbreeze2 分钟前
深入 Linux 线程机制(三):线程互斥——竞争条件与互斥锁的本质
linux·运维·服务器·c++·算法
Mr_Controll4 分钟前
【运动控制——电子凸轮曲线设计(多项式)】
算法·自动化
Sam09278 分钟前
【AI 算法精讲 15】余弦相似度:向量检索与归一化内积
人工智能·python·算法·ai
ALex_zry10 分钟前
C++26 Freestanding 库扩展详解:无操作系统也能用标准库
java·jvm·c++
Tian_Hang13 分钟前
Eclipse Mosquitto 安装及介绍
java·运维·服务器·ide·sql·mysql·eclipse
weelinking13 分钟前
weytoken微元算力企业级大模型治理平台深度评测
java·大数据·人工智能
卓怡学长21 分钟前
w273基于springboot的智能笔记的开发与应用
java·spring boot·spring·intellij-idea
黎阳之光27 分钟前
黎阳之光实时三维重构:重构智慧铁路全新管控范式
大数据·人工智能·物联网·算法·数字孪生
weixin_4000056031 分钟前
Vision-Language-Action:LMDrive项目架构与核心算法组件
人工智能·深度学习·算法·机器学习·架构·自动驾驶
码上有光33 分钟前
c++:map和set的底层实现
android·java·c++·set·map