求两个数的最大公约数&求N个数的最大公约数
一、求两个数的最大公约数
如何编程计算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个数的最大公约数的更多相关文章
- C实现辗转相除法求两个数的最大公约数
什么是辗转相除法? 辗转相除法(又名欧几里德算法),它主要用于求两个正整数的最大公约数.是已知的最古老的算法. 用辗转相除法求132和72的最大公约数的步骤: 132 / 72 = 1 ... 60 ...
- 求两个数的最大公约数(Euclid算法)
求两个数 p 和 q 的最大公约数(greatest common divisor,gcd),利用性质 如果 p > q, p 和 q 的最大公约数 = q 和 (p % q)的最大公约数. 证 ...
- 求两个数a、b的最大公约数
//求两个数a.b的最大公约数 function gcd(a,b){ return b===0?a:gcd(b,a%b) }
- c语言实践:求两个数的最大公约数
我的思路是这样的:比如12和16这两个数.先理解一下概念,什么叫最大公约数.就是12有很多个因数,16也有很多个因数,这两堆因数中有一些重合的因数,在这些重合的因数中找到那个最大的.那么最大公约数一定 ...
- python 函数求两个数的最大公约数和最小公倍数
1. 求最小公倍数的算法: 最小公倍数 = 两个整数的乘积 / 最大公约数 所以我们首先要求出两个整数的最大公约数, 求两个数的最大公约数思路如下: 2. 求最大公约数算法: 1. 整数A对整数 ...
- 求两个整数的最大公约数GCM
思路分析: (1)求差判定法: 如果两个数相差不大,可以用大数减去小数,所得的差与小数的最大公约数就是原来两个数的最大公约数.例如:求78和60的最大公约数.78-60=18,18和60的最大公约数 ...
- C 语言实例 - 求两数的最大公约数
C 语言实例 - 求两数的最大公约数 用户输入两个数,求这两个数的最大公约数. 实例 - 使用 for 和 if #include <stdio.h> int main() { int n ...
- 算法 - 求两个自然数的最大公约数(C++)
//************************************************************************************************** ...
- 【C语言】写一个函数,并调用该函数求两个整数的最大公约数和最小公倍数
程序分析: 在数学中,两个数的最小公倍数=两个数的乘积/两数的最大公约数. 求两个数的最大公约数,运用辗转相除法:已知两个整数M和N,假定M>N,则求M%N. 如果余数为0,则N即为所求:如果余 ...
随机推荐
- Python编程学习第三课之编程从Hello World开始
在搞定了前几节课的情况下,大家是否有一种想要跃跃欲试的赶脚,接下来就是我们开始练手的实战时刻. 每个编程人员入门编程的第一课都是向我们马上要进入的编程世界问好,"你好,世界"英文说 ...
- Matlab .asv文件
参考: https://blog.csdn.net/u013152895/article/details/44724199 有时在存放m文件的文件夹中会出现*.asv asv 就是auto save的 ...
- C语言中最常用的标准库函数
标准头文件包括: <asset.h> <ctype.h> <errno.h> <float.h> <limits ...
- Noip 2013 真题练习
Day1 T1 转圈游戏 Link 一句话题意: 让你求 \({x + m \times 10^k} \bmod n\) 的结果. 直接套上快速幂的板子. code #include<iostr ...
- Tensorflow学习笔记No.2
使用函数式API构建神经网络 函数式API相比于keras.Sequential()具有更加灵活多变的特点. 函数式API主要应用于多输入多输出的网络模型. 利用函数式API构建神经网络主要分为3步, ...
- 加快ASP。NET Core WEB API应用程序。第3部分
下载source from GitHub 对ASP进行深度重构和优化.NET Core WEB API应用程序代码 介绍 第1部分.创建一个测试的RESTful WEB API应用程序. 第2部分.增 ...
- docker-命令帮助
1. 命令参考 http://www.runoob.com/docker/docker-command-manual.html2. docker-命令,可以使用docker --help查看或 ...
- 玩转控件:GDI+动态绘制流程图
前言 今天,要跟大家一起分享是"GDI+动态生成流程图"的功能.别看名字高大上(也就那样儿--!),其实就是动态生成控件,然后GDI+绘制直线连接控件罢了.实际项目效果图如下 ...
- Angluar2 项目搭建
一 使用 Angular CLI 官方脚手架 1.安装 cli npm install -g @angular/cli 2.创建工作空间和初始应用 ng new my-app 二 tsLint 代码格 ...
- Python基本语法之数据类型(总览)
Python的八种数据类型 Number,数值类型 String,字符串,主要用于描述文本 List,列表,一个包含元素的序列 Tuple,元组,和列表类似,但其是不可变的 Set,一个包含元素的集合 ...