【编程--每日一练】

本题目录

  • 每日一练
    • 题目
    • 例子
      • 输入格式
      • 输出格式
      • 样例输入
      • 样例输出
    • 解析
      • 概念
      • 最大公约数
      • 最小公倍数
      • 数字一行输出,以空格隔开
    • 代码

每日一练

题目

输入两个正整数m和n,求其最大公约数和最小公倍数。

例子

输入格式

两个整数

输出格式

最大公约数,最小公倍数

样例输入

5 7

样例输出

1 35

解析

概念

最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个,与最大公约数相对应的概念是最小公倍数。
如果数a能被数b整除,a就叫做b的倍数,b就叫做a的约数。约数和倍数都表示一个整数与另一个整数的关系,不能单独存在。如只能说16是某数的倍数,2是某数的约数,而不能孤立地说16是倍数,2是约数。
几个整数中公有的约数,叫做这几个数的公约数;其中最大的一个,叫做这几个数的最大公约数。
几个数共有的倍数叫做这几个数的公倍数,其中除0以外最小的一个公倍数,叫做这几个数的最小公倍数。

比如1:12、16的公约数有1、2、4,其中最大的一个是4,则4是12与16的最大公约数。
比如2:12、18的公约数有1、2、3、6,其中最大的一个是6,则6是12与18的最大公约数。
比如3:20、40的公约数有1、2、4、5、10、20,其中最大的一个是20,则20是20与40的最大公约数。

18、20的最小公倍数是180
12、18的最小公倍数是36
20、40的最小公倍数是40

最大公约数

  • 暴力求解
    最大公约数一定不会大于两个数之间的最小数,最大也就是两个数的最小值,如20、40的最大公约数是20。

令两个数的最小值为最大公约数,然后我们再用两个数分别除去这两个数的最小值,如果都能整除,则就是最大公约数,否则就自减1再用两个数分别除去,判断是否能整除,不能就自减1,一直循环下去直到找到都能被整除的数。(最坏的情况就是找到1停止)

输入两个数 m,n为5,7, tmp=5,m%tmp and n%tmp,
不能整除,tmp=4
不能整除,tmp=3
不能整除,tmp=2
不能整除,tmp=1
能整除
输出:最大公约数为 1

  • 更相减损法
    ** 以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到它们两个数相等为止。则相等的两个数就是所求的最大公约数。 **
    输入两个数 m,n为12,16,
    n大,tmp = 4, m =12 ,n = 4
    m大,tmp = 8, m = 8, n = 4
    m大,tmp = 4, m = 4,n = 4
    m==n,输出最大公约数:4
  • 辗转相除法
    先求出其中任意两个数的最大公约数,再求这个最大公约数与第三个数的最大公约数,依次求下去,直到最后一个数为止。最后所得的那个最大公约数,就是所有这些数的最大公约数。
    输入两个数 m,n为12,16,
    tmp = m%n=12, m = n=16, n = tmp=12
    tmp = m%n=4, m=n=12, n = tmp = 4
    tmp = m%n = 0,m= n = 4,n=0
    n==0,输出最大公约数:4
  • 递归法
    和更像减损法一样,写进函数中,具体看下面代码

最小公倍数

  • 暴力求解
    先找出两个数的最大值,然后赋值给变量tmp,然后用变量tmp分别除去两个数,如果能整除,则就是最小公倍数,否则变量tmp自加1,再分别除去两个数,判断是否能整除,一直循环下去,直到变量tmp都能够整除两个数。

比如12、18这两个数,这两个数的最大值是18,则定义变量tmp=18,然后判断变量tmp是否都能整除12、18。
tmp=18,不能整除12、18,自加1
tmp=19,不能整除12、18,自加1
tmp=20,不能整除12、18,自加1
tmp=21,不能整除12、18,自加1
tmp=22,不能整除12、18,自加1
········
tmp=36,都能整除12、18
所以找到最小公倍数了,12,18的最小公倍数是36

  • 公式法
    由于两个数的乘积等于这两个数的最大公约数与最小公倍数的积。
    所以,求两个数的最小公倍数,就可以先求出它们的最大公约数,然后用两个数的积除去最大公约数得出它们的最小公倍数。

数字一行输出,以空格隔开

    1. 使用print函数和字符串拼接
      最简单的方法是使用print函数和字符串拼接操作符(+)将两个数字转换为字符串,并在中间添加一个空格。
a = 3
b = 5
print(str(a) + ' ' + str(b))

这段代码首先将变量a和b分别转换为字符串,然后使用字符串拼接操作符(+)将它们连接起来,并在中间添加一个空格。最后,通过print函数将结果输出到控制台。运行代码,将会得到以下输出:

3 5

这种方法简单直接,适用于简单的输出需求。但是,如果要输出多个变量,代码会变得冗长且难以维护。

    1. 使用字符串格式化
      更优雅的方式是使用字符串格式化。Python提供了多种字符串格式化的方法,其中一种是使用百分号(%)作为占位符。
a = 3
b = 5
print('%d %d' % (a, b))

在这段代码中,%d表示整数类型的占位符,%后面的小括号中的a和b分别是要替换的变量。当代码运行时,%d会被变量的值替换,最后结果将会被输出到控制台。运行代码,将会得到以下输出:

3 5

使用字符串格式化的方法可以简化代码,并且可以更灵活地控制输出的格式。

    1. 使用f-string
      Python 3.6及以上版本引入了一种新的字符串格式化方法,称为f-string。它使用花括号({})和变量名来表示要替换的部分。
a = 3
b = 5
print(f'{a} {b}')

在这段代码中,花括号中的变量名a和b将会被对应的值替换。运行代码,将会得到以下输出:

3 5

代码

m,n = map(int,input().split())

# -----------最大公约数----------
# 1.暴力求解
tmp = m if m < n else n
while(1):
    if m % tmp == 0 and n % tmp == 0:
        break
    else:
        tmp-=1
print(tmp)

#更相减损法
tmp = 0
while(m != n):
    if m > n:
        tmp = m-n
        m = n
        n = tmp
    else:
        tmp = n-m
        m = n
        n = tmp
print(tmp)

#辗转相除法
tmp = 1
while(m != 0):
    tmp = n % m
    n = m
    m = tmp
print(n)

#递归
def fun(m, n):
    if m > n:
        return fun(m-n, n)
    elif m < n:
        return fun(m, n-m)
    else:
        return m
print(fun(m, n))


# -----------最小公倍数----------

#暴力求解
tmp = m if m>n else n
while(1):
    if (tmp % m ==0 and tmp%n == 0):
        break
    else:
        tmp+=1
print(tmp)

#公式法
print(int(m*n/tmp))
x=tmp
y=int(m*n/tmp)
print(str(x) + ' ' + str(y))
print("%d %d" %(x,y))
print(f'{x} {y}')

你可能感兴趣的:(编程,学习,算法,数据结构)