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 }

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

  • 相关阅读:
    servlet规范
    Java --Servlet 32个经典问题
    TCP的三次握手与四次挥手理解及面试题(很全面)
    TCP‘三次握手’和‘四次挥手’(通俗易懂)
    leetcode:122. Best Time to Buy and Sell Stock II(java)解答
    STM32通过调用库函数进行编程
    Swift下调用Touch ID实现指纹识别
    SpringMVC+MyBatis+JMS+JTA(分布式事务)
    windows下的两个等待函数
    Ubuntu 14.04正式公布,一个不眠之夜
  • 原文地址:https://www.cnblogs.com/xiaotiaosi/p/6890988.html
Copyright © 2011-2022 走看看