zoukankan      html  css  js  c++  java
  • 求两个数的最大公因数

    这里提供两种方法:一种比较朴素,基本思想很简单就是按照从大到小的找能够匹配的因数,找到就返回;另一种是欧几里得算法,该算法的核心思想是,当前两个数的最大公因数的也是这两个数模的与其中一个元素的的最大公因数,然后递归算出。当两个数的模等于0时,则找到了最大公因数。

    第一种:朴素的算法

    算法思想:基本思想很简单就是按照从大到小的找能够匹配的因数,找到就返回;

    时间复杂度:O(n)

    代码(Java实现):

     1 package Gcd;
     2 /*
     3  * 求两个数的最大公因数的朴素算法。
     4  */
     5 public class gcd1 {
     6     public static int gcd_find(int a,int b){
     7         //先找一个数的当前最大因数,当前因数是否是另一个数的因数,如果是则返回,否则找下一个较小的因数,直到找到为止
     8         if(b%a==0)
     9             return a;
    10         int nowMaxGid=a/2;
    11         for(int i=nowMaxGid;i>=1;i--){
    12             if(a%i==0&&b%i==0){
    13                 return i;
    14             }
    15         }
    16         return 1;
    17     }
    18     public static void main(String[] args) {
    19         System.out.println(gcd_find(88,1000));
    20     }
    21 
    22 }

    红色标记的是核心代码。

    第二种:欧几里得算法

    算法思想:该算法的核心思想是,当前两个数的最大公因数的也是这两个数模的与其中一个较小的元素的的最大公因数,然后递除算出。当两个数的模等于0时,则找到了最大公因数。

    时间复杂度:O(logn)

    代码(Java实现):

     1 package Gcd;
     2 /*
     3  * 求出两个数的最大公因数(欧几里得算法)
     4  */
     5 public class gcd2 {
     6 
     7     public static int gcd_find(int a,int b){
     8         
     9         while(b!=0){
    10             int mark=a%b;
    11             a=b;
    12             b=mark;
    13         }
    14         return a;
    15     }
    16     public static void main(String[] args) {
    17         System.out.println(gcd_find(10,8));
    18     }
    19 }

    通过两种方法的对比,欧几里得算法计算时间特别快,而朴素算法则差很多,特别当数很大的时候,更是需要花费更多时间。

  • 相关阅读:
    Apache Flink 1.12.1发布
    flink 修改web页面刷新时间
    flink 支持的sql 方言
    flink sql 读取hive 表报错
    Typora配置正文、目录、侧边大纲中的标题自动编号
    滴滴开源Logi-KafkaManager 一站式Kafka监控与管控平台
    建立 nfs 服务器
    Linux 设备驱动的第一个例子 。
    备份.vimrc
    shell编程实例
  • 原文地址:https://www.cnblogs.com/xiaotiaosi/p/6890988.html
Copyright © 2011-2022 走看看