一、求两个数的最大公约数

  如何编程计算N个数的最大公约数(Greatest common divisor)呢?第一想法那便是两两计算,但是往往最简单的想法是不怎么靠谱的。下面用递归来解决。递归有一大好处,那便是递归非常符合人的思维,有时即使很复杂,但是依仗着递归的规律性,可以断定或推测出按递归做是正确的。如果说递归的性能低,我们可以采用备忘录法,用表记录过已经计算过的问题,避免二次计算,这样在一定程度上可以带来性能上的提升。我们可以先用递归实现,倘若在实际情况中发现性能问题,我们可以再进行优化。但是如果一开始的代码就是在考究性能,甚至考虑到用位运算等等,那么再修改程序时,那会非常困难,也许过了一段时间后,自己一下子也会读不懂自己写的代码了。“过早优化是万恶之源”。我认为,在这个时代,把代码写的很清楚,流程很明朗,这应该是我们追求的,这样可以体现出你的思考过程。

用辗转相除法求公约数

 1     /**
2 * 求两个数的最大公约数
3 * @param a
4 * @param b
5 * @return
6 */
7 public int getGCDInTwo(int a,int b)
8 {
9 if(b==0)
10 {
11 return a;
12 }
13 else
14 {
15 return getGCDInTwo(b,a%b);
16 }
17 }

二、求N个数的最大公约数

  用递归的思想来思考,我们可以这样想,要求N个数的最大公约数,我们可以求第N个数和[其余N-1个数的最大公约数]的公约数,要求N-1个数的最大公约数,我们可以求第N-1个数和[其余N-2个数的最大公约数]的公约数…………如此递归下去,直到N值为1,这时停止递归,返回元素值(这时仅有一个元素),接下去那便是pop栈,最后计算出结果。代码如下(要用到以上辗转相除法求公约数的代码):

 1     /**
2 * 求N个数的最大公约数
3 * @param arr
4 * @param len:len为求数组中前len个数的最大公约数
5 * @return
6 */
7 public int getGCDInN(int[] arr,int len)
8 {
9 if(len==1)
10 {
11 return arr[0];
12 }
13 else
14 {
15 return getGCDInTwo(arr[len-1],getGCDInN(arr,len-1));
16 }
17 }

三、总结

  平时我们应当养成用递归思考问题的习惯,因为递归非常符合人的思维,递归有时会让你很惊喜。

求两个数的最大公约数&求N个数的最大公约数的更多相关文章

  1. C实现辗转相除法求两个数的最大公约数

    什么是辗转相除法? 辗转相除法(又名欧几里德算法),它主要用于求两个正整数的最大公约数.是已知的最古老的算法. 用辗转相除法求132和72的最大公约数的步骤: 132 / 72 = 1 ... 60 ...

  2. 求两个数的最大公约数(Euclid算法)

    求两个数 p 和 q 的最大公约数(greatest common divisor,gcd),利用性质 如果 p > q, p 和 q 的最大公约数 = q 和 (p % q)的最大公约数. 证 ...

  3. 求两个数a、b的最大公约数

    //求两个数a.b的最大公约数 function gcd(a,b){ return b===0?a:gcd(b,a%b) }

  4. c语言实践:求两个数的最大公约数

    我的思路是这样的:比如12和16这两个数.先理解一下概念,什么叫最大公约数.就是12有很多个因数,16也有很多个因数,这两堆因数中有一些重合的因数,在这些重合的因数中找到那个最大的.那么最大公约数一定 ...

  5. python 函数求两个数的最大公约数和最小公倍数

    1. 求最小公倍数的算法: 最小公倍数  =  两个整数的乘积 /  最大公约数 所以我们首先要求出两个整数的最大公约数, 求两个数的最大公约数思路如下: 2. 求最大公约数算法: 1. 整数A对整数 ...

  6. 求两个整数的最大公约数GCM

    思路分析: (1)求差判定法:  如果两个数相差不大,可以用大数减去小数,所得的差与小数的最大公约数就是原来两个数的最大公约数.例如:求78和60的最大公约数.78-60=18,18和60的最大公约数 ...

  7. C 语言实例 - 求两数的最大公约数

    C 语言实例 - 求两数的最大公约数 用户输入两个数,求这两个数的最大公约数. 实例 - 使用 for 和 if #include <stdio.h> int main() { int n ...

  8. 算法 - 求两个自然数的最大公约数(C++)

    //************************************************************************************************** ...

  9. 【C语言】写一个函数,并调用该函数求两个整数的最大公约数和最小公倍数

    程序分析: 在数学中,两个数的最小公倍数=两个数的乘积/两数的最大公约数. 求两个数的最大公约数,运用辗转相除法:已知两个整数M和N,假定M>N,则求M%N. 如果余数为0,则N即为所求:如果余 ...

随机推荐

  1. 在C++中使用libuv时对回调的处理

    新的解决方法 https://www.cnblogs.com/ink19/p/13768425.html libuv简介 libuv是一个可以跨平台的C语言库,它提供了基于事件的异步IO支持[1].提 ...

  2. 068 01 Android 零基础入门 01 Java基础语法 08 Java方法 06 参数传递问题——基本数据类型传值

    068 01 Android 零基础入门 01 Java基础语法 08 Java方法 06 参数传递问题--基本数据类型传值 本文知识点:参数传递问题--基本数据类型传值 说明:因为时间紧张,本人写博 ...

  3. Vue学习使用系列九【axiox全局默认配置以及结合Asp.NetCore3.1 WebApi 生成显示Base64的图形验证码】

    1:前端code 1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta char ...

  4. 2020武汉dotNET俱乐部分享交流活动正式启动

    去年9月去上海参加了2019 .NET开发者峰会,感触良多.回来后便一直想着在武汉也组织一场这样的活动,推动一下武汉.NET的发展.由于疫情的影响,这个想法一直被搁浅,好在疫情总算是控制住了,所以我们 ...

  5. php-fpm 的各种启动方式

    启动 php-fpm 最简单的操作: /usr/local/php/sbin/php-fpm php 5.3.3 以后的php-fpm 不再支持 php-fpm 以前具有的 /usr/local/ph ...

  6. Nuxt|Vue仿探探/陌陌卡片式滑动|vue仿Tinder拖拽翻牌效果

    探探/Tinder是一个很火的陌生人社交App,趁着国庆假期闲暇时间倒腾了个Nuxt.js项目,项目中有个模块模仿探探滑动切换界面效果.支持左右拖拽滑动like和no like及滑动回弹效果. 一览效 ...

  7. (OK) Android内核(4.9)集成最新版MPTCP---成功

    Android内核(4.9)集成最新版MPTCP---成功

  8. volatile型变量语义讲解一 :对所有线程的可见性

    volatile型变量语义讲解一 :对所有线程的可见性 一.volatile变量语义一的概念 当一个变量被定义成volatile之后,具备两个特性: 特性一:保证此变量对所有线程的可见性.这里的&qu ...

  9. IGBT以及MOSFET驱动参数的计算方法

  10. GDB将所有线程堆栈输出到文件

    在调试多线程程序时,经常需要查看线程堆栈信息,如果线程数目过多,每次查看一个线程堆栈,繁琐耗时.下面介绍一种一次性将所有线程堆栈输出到文件的方法. 首先,将gdb attach到调试线程 gdb -p ...