题目描述

求两个给定正整数的最大公约数和最小公倍数

题目要求

  • 输入格式:输入在两行中分别输入正整数x和y
  • 输出格式:在一行中输出最大公约数和最小公倍数的值
  • 例如:输入100 1520 输出20 7600

题目解析

(1)几个整数中公有的约数,叫做这几个数的公约数;其中最大的一个,叫做这几个数的最大公约数

例如:求24和60的最大公约数,先分解质因数,得24=2×2×2×3,60=2×2×3×5,24与60的全部公有的质因数是2、2、3,它们的积是2×2×3=12,所以,(24,60)=12。

(2)几个自然数公有的倍数,叫做这几个数的公倍数,其中最小的一个自然数,叫做这几个数的最小公倍数

例如:求6和15的最小公倍数。先分解质因数,得6=2×3,15=3×5,6和15的全部公有的质因数是3,6独有质因数是2,15独有的质因数是5,2×3×5=30,30里面包含6的全部质因数2和3,还包含了15的全部质因数3和5,且30是6和15的公倍数中最小的一个,所以[6,15]=30。

思路

(1)最大公约数
假设最大公约数为a,2个数为x和y,则x一定能够整除a,且y也能整除a,如24和60的最大公约数为24
求最大公约数时,最大公约数的范围是[1,最小值],故可以用x和y对从1开始的整数取余,若余数为0,则说明可以整除,保存该约数,直到取到最大约数,即为最大公约数

(2)最小公倍数

假设最小公倍数为b,2个数为x和y,作为x和y的公倍数,则b一定能够整除x和y,如6和15的最小公倍数为30
求最小公倍数时,最小公倍数的范围是[x和y的最大值,正无穷],故从x和y的最大值开始,对x和y取余,当第一个余数为0时,则此时的数即为x和y的最小公倍数

def hcf(x,y):  #定义最大公约数
    if x>y:
        smaller = y
    else:
        smaller = x  #先比较2个数的大小,将较小的数赋值给smaller
    for i in range(1,smaller + 1):  #给定i的范围,从1开始,smaller结束,range函数为左闭右开,故smaller要加1
        if((x%i == 0) and (y % i== 0)):  #如果x能够整除i  且 y也能整除i
            hcf = i  #将i赋值给hcf
    return hcf  # 循环结束后返回最大的i值,即是公约数
def lcm(x,y):       #定义最小公倍数
    if x>y:
        greater =x
    else:
        greater =y   #先比较2个数的大小,将较大的数赋值给greater
    while(True):
        if((greater%x==0) and (greater%y == 0)):  #如果greater能够整除x和y
            lcm =greater  # 则将greater赋值给lcm
            break  #跳出循环
        greater +=1   # greater=greater+1,重新开始循环
    return lcm
num1 = int(input("输入第一个数字:"))
num2 = int(input("输入第二个数字:"))
print("最大公约数为:",hcf(num1,num2),"最小公倍数为:",lcm(num1,num2))

运行结果:

Python函数设计 整数的真约数 python求正整数n的所有约数_Python函数设计 整数的真约数