题目
在不超过19000的正整数中,与19000互质的数的个数是多少?
思路
求最大公约数、辗转相处法
a / b=k + r(a,b,k,r皆为正整数,且r < b),则r = a mod b。
欧几里得算法指出,对于整数a和b,如果a可以被b整除,那么它们的最大公因数为b。然而,如果a不可以被b整除,那么结果就是b与(a除以b的余数 r)的最大公因数。
代码一
def ac(a,b):
mod=2 #随便定义一个余数
while mod!=0: #当余数等于0是最大公约数
mod=a%b
a=b
b=mod
return a
d=ac(12,26)
print(d) #2
#求互质个数
s=0
for i in range(1,19000):
if ac(i,19000)==1: #最大公约数是1
s+=1
print(s)
实现欧几里得算法
欧几里得算法:gcd(a,b)=gcd(b,a mod b)
eg: gcd(60,21) = gcd(21,18) = gcd(18,3) = gcd(3,0) = 3
def gcd(a,b):
if b==0:
return a
else:
return gcd(b,a%b)
print(gcd(2,3)) #1
【思路】
需要使用递归来完成,可以看到,当除数为0是推出递归的条件
结果
最小公倍数计算
代码
def gbs(a,b):
#从最大值开始计算,获取最大值
if a>b:
maxnum=a
else:
maxnum=b
while True:
if maxnum % a == 0 and maxnum % b == 0:
mx=maxnum
break
maxnum+=1
return mx
a,b=12,2
print(gbs(a,b))
结果