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

回来果断复习下,常用方法辗转相除法和更相减损法,小学奥数都学过,很简单,就不细说了,忘了的话可以百度: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. UVA725

    虽然是暴力求解,但是也要观察条件,尽量提高效率.如本题,原本要枚举10个数,但是分析可知通过枚举fghij就可以了. #include<stdio.h> #include<strin ...

  2. Chrome 开发工具之Sources

    Sources面板主要用于查看web站点的资源列表及javascript代码的debug 熟悉面板 了解完面板之后,下面来试试这些功能都是如何使用的. 文件列表 展示当前页面内所引用资源的列表,和平常 ...

  3. Android SD卡存储

    原创文章,转载请注明出处:http://www.cnblogs.com/baipengzhan/p/Android_SDcard_store.html 一 概念 SD卡存储空间比较大,当需要存取较大的 ...

  4. AngularJS版本下载

    大家可以从下面地址获取AngularJS所以版本: https://code.angularjs.org/

  5. Python socket编程之八:阶段性总结

    f1.py # -*- coding: utf-8 -*- import sqlalchemy import tushare import pandas import socket import st ...

  6. jquery1.7.2的源码分析(一)

    说到jquery可能是大家最经常用到的,在日常的编写程序中最经常使用到,在使用jquery插件的同时,深入的解读jquery源码有利于我们学到设计的思想和实现的技巧 在jquery源码的分析中,其中艾 ...

  7. Eclipse启动Tomcat时server.xml和content.xml自动还原问题

    当我们在处理中文乱码或是配置数据源时,我们要修改Tomcat下的server.xml和content.xml文件. 但是当我们修改完后重启Tomcat服务器时发现xml文件又被还原了,修改无效果. 为 ...

  8. C#中DataTable中的Compute方法使用收集

    原文: C#中DataTable中的Compute方法使用收集 Compute函数的参数就两个:Expression,和Filter. Expresstion是计算表达式,关于Expression的详 ...

  9. MyEclipse安装插件的几种方法

    本文讲解MyEclipse(MyEclipse10)的三种方法,以SVN为例 Eclipse update site URL: http://subclipse.tigris.org/update_1 ...

  10. SQL语句生成指定范围内随机数

    1.生成随机实型数据 create procedure awf_RandDouble @min dec(14,2), @max dec(14,2), @result dec(14,2) output ...