今天面试,遇到面试官询求最大公约数。小学就学过的奥数题,居然忘了!只好回答分解质因数再求解!

回来果断复习下,常用方法辗转相除法和更相减损法,小学奥数都学过,很简单,就不细说了,忘了的话可以百度:http://baike.baidu.com/link?url=Ba106RbHkMjZm3rolmCHEEFt3eDkVbngcReykcqt4Wv0dbTI_0ZmTDE5b0X-xWFx

以下是代码实现,这两种方法,还有常规的分解因式,顺便比较了一下效率,其中分解因式用了两种方法来求取小于该数字的所有质数,:

#coding:utf-8
import time
#辗转相除法:
def commonDivisor1(num1,num2):
if num1 < num2:
temp = num1
num1 = num2
num2 = temp if num1%num2 ==0:
return num2
else:
num2 = num1%num2
return commonDivisor1(num1,num2) #更相减损法
def commonDivisor2(num1,num2):
if num1==num2:return num1
elif num1 < num2:
temp = num1
num1 = num2
num2 = temp
if num1 - num2 == num2:
return num2
else:
temp = num1
num1 = num2
num2 = temp - num2
#print (num1,' ', num2)
return commonDivisor2(num1,num2) #分解质因数,之后求解
def commonDivisor3(num1,num2):
if num1==num2:return num1
elif num1 < num2:
temp = num1
num1 = num2
num2 = temp
#求小于较小数字的所有素数
primeNum = getPrimeNumber1(num2)
#print (primeNum)
#对较小的数字分解质因数,并将质因数保存在l2中
l2 = []
result = 1
while num2 != 1:
for i in primeNum:
if num2 % i !=0:
continue
else:
l2.append(i)
num2 = num2 / i
#print ('l2: ',l2)
#使用较大数字去除较小数字的质因数,看大数字中包含了哪些较小数字的质因数。
#将大数字也包含的相同的质因数相乘返回结果,即最大公约数
for i in l2:
if num1 % i == 0:
result = result*i
num1 = num1/i
return result #分解质因数,之后求解
def commonDivisor4(num1,num2):
if num1==num2:return num1
elif num1 < num2:
temp = num1
num1 = num2
num2 = temp
#求小于较小数字的所有素数
primeNum = getPrimeNumber2(num2)
#print (primeNum)
#对较小的数字分解质因数,并将质因数保存在l2中
l2 = []
result = 1
while num2 != 1:
for i in primeNum:
if num2 % i !=0:
continue
else:
l2.append(i)
num2 = num2 / i
#print ('l2: ',l2)
#使用较大数字去除较小数字的质因数,看大数字中包含了哪些较小数字的质因数。
#将大数字也包含的相同的质因数相乘返回结果,即最大公约数
for i in l2:
if num1 % i == 0:
result = result*i
num1 = num1/i
return result #列出小于num的所有奇数,首先去除可以被2整除的,再去除可以被3整除的,再去除可以被5整除的,以此类推...
def getPrimeNumber1(num):
l = [2]
for i in range(3,num+1,2):
l.append(i)
j = min(l)
while not j == l[-1]:
for k in l:
if (k%j==0) and k != j:
#print ('remove: ',k)
l.remove(k)
#print (l,' ',j)
j = l[l.index(j)+1]
return l #用生成器和filter求num以内的所有质数
def getPrimeNumber2(num):
l=[]
for n in primes():
if n < num:
l.append(n)
else:
break
return l #创建打印奇数的生成器
def _odd_iter():
n = 1
while True:
n = n + 2
yield n #创建过滤条件,即过滤掉可以被列表中下一个数字整除的数字,留下不可以被这个数整除的,即留下质数
def _not_divisible(n):
return lambda x: x % n > 0 #不断迭代生成列表,根据规则过滤掉列表中元素,留下质数
def primes():
yield 2
it = _odd_iter() # 初始序列
while True:
n = next(it) # 返回序列的第一个数
yield n
it = filter(_not_divisible(n), it) # 构造新序列 time1 = time.clock()
print (commonDivisor1(12355,525))
time2 = time.clock()
print (commonDivisor2(12355,525))
time3 = time.clock()
print (commonDivisor3(12355,525))
time4 = time.clock()
print (commonDivisor4(12355,525))
time5 = time.clock() print ('辗转相除法用时: ', (time2-time1)*1000,'秒')
print ('更相减损法用时: ', (time3-time2)*1000,'秒')
print ('分解质因数法用时(用列表求质数): ', (time4-time3)*1000,'秒')
print ('分解质因数法用时(用生成器求质数): ', (time5-time4)*1000,'秒')

测试结果:

随便测试两个数字,发现辗转相除法明显是最快的,原因也很明显,计算次数明显比更相减损法少,传统分解因式方法,那效率自然不用说了。

35
35
35
35
辗转相除法用时:  0.014617272401167485 秒
更相减损法用时:  0.15565419800162134 秒
分解质因数法用时(用列表求质数):  9.131449575150953 秒
分解质因数法用时(用生成器求质数):  8.505277230398239 秒

求两个数字的最大公约数-Python实现,三种方法效率比较,包含质数打印质数的方法的更多相关文章

  1. JavaScript求两个数字之间所有数字的和

    这是在fcc上的中级算法中的第一题,拉出来的原因并不是因为有什么好说的,而是我刚看时以为是求两个数字的和, 很显然错了.我感觉自己的文字理解能力被严重鄙视了- -.故拉出来折腾折腾. 要求: 给你一个 ...

  2. c 求两个整数的最大公约数和最小公倍数

    //求最大公约数是用辗转相除法,最小公倍数是根据公式 m,n 的 最大公约数* m,n最小公倍数 = m*n 来计算 #include<stdio.h> //将两个整数升序排列 void ...

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

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

  4. 【剑指Offer】和为S的两个数字 解题报告(Python)

    [剑指Offer]和为S的两个数字 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...

  5. python selenium 三种等待方式详解[转]

    python selenium 三种等待方式详解   引言: 当你觉得你的定位没有问题,但是却直接报了元素不可见,那你就可以考虑是不是因为程序运行太快或者页面加载太慢造成了元素不可见,那就必须要加等待 ...

  6. mac学习Python第一天:安装、软件说明、运行python的三种方法

    一.Python安装 从Python官网下载Python 3.x的安装程序,下载后双击运行并安装即可: Python有两个版本,一个是2.x版,一个是3.x版,这两个版本是不兼容的. MAC 系统一般 ...

  7. 学习Python的三种境界

    前言 王国维在<人间词话>中将读书分为了三种境界:"古今之成大事业.大学问者,必经过三种之境界:'昨夜西风凋碧树,独上高楼,望尽天涯路'.此第一境也.'衣带渐宽终不悔,为伊消得人 ...

  8. Python的三种格式化输出

    今天刚学了python的三种格式化输出,以前没接触过这么有趣的输出方式,现在来分享一下. #!/user/bin/env python#coding:utf-8#三种格式化输出 #第一种格式化输出na ...

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

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

随机推荐

  1. Android——Adapter

    Adapter——本身只是一个接口.Adapter是将数据绑定到UI界面上的桥接类.Adapter负责创建显示每个项目的子View和提供对下层数据的访问. 数据适配器作用:把复杂的数据(数组.链表.数 ...

  2. Pitfalls: C++ 中的index运算符

    名可名, 非常名 在调一个题目的过程中发现了一个之前从未意识到的问题. 考虑如下代码 vector<int> a; int f(int x){ a.push_back(x); return ...

  3. 数据结构作业——buzhidao(队列)

    buzhidao Description 有一个长度为 n 的序列,第 i 个数的大小为 a[i].现在从第 1 个数开始从左往右进行以下操作:1. 如果当前数是剩下的数中最大的,则输出并删去这个数. ...

  4. CSS样式表

    CSS样式及属性 样式标的基本概念 样式表的分类 1.内联样式表 和html联合显示,控制精确,但可重用性差,冗余多. 例:<p style="font-size:14px;" ...

  5. variadic function 的使用

    最近在看<the c programming language> K&R 7.3章 Variable-length Argument Lists  变长参数列表, 笔记一下用法 1 ...

  6. spring事务传播性与隔离级别

    事务的7种传播级别: 1)PROPAGATION_REQUIRED:支持当前事务,没有事务就新建一个. 2)PROPAGATION_SUPPORTS:支持当前事务,如果没有事务,以非事务方式处理 3) ...

  7. .NET Framework(.config)的配置文件架构

    配置文件是标准的XML文件..NET Framework定义了一组实现配置设置的元素.本节描述计算机配置文件.应用程序配置文件和安全配置文件的配置架构.如果希望直接编辑配置文件,您需要熟悉XML.XM ...

  8. Code Snippets 代码片段

    Code Snippets 代码片段       1.Title : 代码片段的标题 2.Summary : 代码片段的描述文字 3.Platform : 可以使用代码片段的平台,有IOS/OS X/ ...

  9. Linux查找命令

    最近,我在学习Linux,下面是一些笔记. 使用电脑的时候,经常需要查找文件. 在Linux中,有很多方法可以做到这一点.国外网站LinuxHaxor总结了五条命令,你可以看看自己知道几条.大多数程序 ...

  10. IIS部署遇到的一些问题

    IIS部署时候会遇到一些具体的问题,记录一下.此处的部署环境为Windows Server 2012 64位版本 1.基本部署:角色和功能管理-->web服务器,勾选相应的服务与功能,然后安装即 ...