洛谷 P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题 Python题解

"""
P,Q 是正整数。
x0为最大公约数,以y0为最小公倍数。
"""
x0, y0 = map(int, input().split())


def gcd(x, y):  # 最大公约数
    if x < y:
        x, y = y, x
    r = x % y  # x是大数 y是小数 24%15
    while r != 0:
        x = y
        y = r
        r = x % y
    return y


def lcm(x, y):  # 最小公倍数 x是大数 y是小数
    if x < y:
        x, y = y, x
    m = x
    while x % y != 0:
        x = x+m
    return x


n = x0 * y0  # 两个数的积等于它们最大公约数和它们最小公倍数的积  
# 就是不要死脑筋 不要想着P和Q是两个数 其实循环一个另外一个也出来了 i和n//i 不就出来了呗
ans = 0
for i in range(x0,y0+1):  # x×y=P×Q, gcd(x,y)=P ,lcm(x,y)=Q 
    if n % i == 0 and gcd(i, n // i) == x0 and lcm(i, n // i) == y0:  # 能被整除 且i和n//i的最小公倍数是y0 最大公约数是x0
        ans += 1
print(ans)

完全可以优化,首先GCD和LCM在math库中都有,循环次数也不需要那么大,因为有重复的,if条件只需要两个就可以了,不需要三个。这样写只是为了能看懂,也说一下最小公倍数和最大公约数的写法

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值