目录
求得两个正整数的最大公约数
- 约数概念:a%b=0,表明a是b的倍数,b是a的约数。
- 最大公约数概念:如果一个数既是a又是b的约数,那么我们就把这个数叫着a和b的公约数,如果这个数在a b的所有公约数里为最小,那这个数就是最大公约数。
- 比如12,16的公约数有1、2、4,两者的最大公约数为4
该问题的解
def ged(x,y):
min_=y if x>y else x
for i in range(1,min_+1): # a,b的最大公约数可能是a,b其中的一个,所以最大公约数必须小于ab之中的最小值
if x% i==0 and y% i ==0:
ged=i
return ged
ged(12,16),ged(12,6)
>>> 4,6
求得两个正整数的最小公倍数
- 倍数概念:a%b=0,表明a是b的倍数,b是a的约数。
- 如果一个数既是a又是b的倍数,那么我们就把这个数叫着a和b的公倍数,如果这个数在a b的所有公倍数里为最小,那这个数就是最小公倍数
- 比如12,16的公倍数有48,96,…(无限多个),两者的最小公倍数为48
该问题的解
def lcm(x,y):
greater=x if x>y else y
while True:
if (greater%x==0)and (greater%y==0):
lcm=greater
break
greater+=1
return lcm
lcm(5,8)
>>> 40
python中的%代表取余,在很多算法中该运算符号都起到了相当重要的作用
a%b=0,表明a、b之间可能存在三种关系:
1、a=0
2、a=b
3、a=kb(k为常数)
五个数能够组成多少互相不相同的三位数
这是一个排列组合问题,python的内置模块itertools中含有相关函数,能够很好的解决该问题
函数 | 返回类型 | 相当于 |
---|---|---|
itertools.permutations('ABCD', 2) | itertools.permutations(可通过迭代访问其中元素,也可以通过类型转换函数转换类型,如list()) | A 4 2 = 12 A_4^2=12 A42=12,即排列数 |
itertools.combinations('ABCD', 2) | itertools.combinations | C 4 2 = 6 C_4^2=6 C42=6,即组合数 |
permutations()
itertools.permutations(iterable, r=None)
r表示子序列的长度,默认值为len(iterable)
combinations()
itertools.combinations(iterable,r=None)
r表示子序列的长度,默认值为len(iterable)
该问题的解(排列数)
r=permutations([3,4,5,6,7],3)
rr=list(r)
len(rr)
>>> 60
for j in range(1,7):
print(rr[j*10-10:j*10])
>>> [(3, 4, 5), (3, 4, 6), (3, 4, 7), (3, 5, 4), (3, 5, 6), (3, 5, 7), (3, 6, 4), (3, 6, 5), (3, 6, 7), (3, 7, 4)]
[(3, 7, 5), (3, 7, 6), (4, 3, 5), (4, 3, 6), (4, 3, 7), (4, 5, 3), (4, 5, 6), (4, 5, 7), (4, 6, 3), (4, 6, 5)]
[(4, 6, 7), (4, 7, 3), (4, 7, 5), (4, 7, 6), (5, 3, 4), (5, 3, 6), (5, 3, 7), (5, 4, 3), (5, 4, 6), (5, 4, 7)]
[(5, 6, 3), (5, 6, 4), (5, 6, 7), (5, 7, 3), (5, 7, 4), (5, 7, 6), (6, 3, 4), (6, 3, 5), (6, 3, 7), (6, 4, 3)]
[(6, 4, 5), (6, 4, 7), (6, 5, 3), (6, 5, 4), (6, 5, 7), (6, 7, 3), (6, 7, 4), (6, 7, 5), (7, 3, 4), (7, 3, 5)]
[(7, 3, 6), (7, 4, 3), (7, 4, 5), (7, 4, 6), (7, 5, 3), (7, 5, 4), (7, 5, 6), (7, 6, 3), (7, 6, 4), (7, 6, 5)]
判断某个数是否为质数
质数:一个大于1的自然数,除了1和它本身不能被其他自然数整除
该问题的解
def isprime_num(num):
if num>1:
for i in range(2,num):
if (num%i)==0: # 如果num%i==0表明num=ki(k为常数)
print(num,'不是质数')
break
else:
print(num,'是质数')
else:
print(num,'是质数')
isprime_num(7)
>>> 7是质数
上面我们已经知道:a%b=0的三种情况,根据质数的概念我们可以舍去前两种情况,剩下的第三种情况从这个角度我们或许可以这样理解质数:除了1和它本身,质数不再是任何一个正整数的倍数
判断某个年份是否为闰年
闰年:能被4整除但是不能被100整除的年份(普通闰年)或者能被400整除的年份(世纪闰年)
该问题的解
def isleap_year(year):
if ((year%4==0)and(year%100!=0))or(year%400==0):
print(f'{year}是闰年')
else:
print(f'{year}不是闰年')
isleap_year(2000)
>>> 2000是闰年
生成九九乘法表
主要考虑制表符’\t’的使用
该问题的解
for i in range(1,10):
for j in range(1,i+1):
print(f'{i}*{j}={i*j}',end='\t')
print('')
运行结果