3 条题解

  • 1
    @ 2023-09-23 15:38:37

    题目看似复杂,实际上简化完毕后就是给定a,b,c三个数求它们的最大公约数
    所以有以下三种方法

    方法1: 短除法

    def gcd1(a,b) :
        t=1
        for i in range(2,min(a,b)+1) :
            while (a%i==0 and b%i==0) :
                t*=i
                a/=i
                b/=i
        return t
    

    这是最简单的一种方法,其核心思路为遍历2到a与b之间最小值的所有数(其实只需要遍历所有质数但这里数据实在太小所以可以偷懒awa)如果此数同时是ab的约数,就记录并从ab中除去它,最后返回记录的所有数的积即可

    方法2: 辗转相除法

    def gcd2(a,b) :
        if (a<b) :
            a,b=b,a
        t=a%b
        while t!=0 :
            a=b
            b=t
            t=a%b
        return b
    

    知名度最高的方法(?),从a/b开始用当前余数除以上一步余数直到除尽为止,此时余数就是最大公约数(第一步swap操作有没有不影响)

    方法3: 更相减损法

    def gcd3(a,b) :
        t=0
        while a%2==0 and b%2==0 :
            a/=2
            b/=2
            t+=1
        while a!=b :
            if a>b :
                a-=b
            elif a<b :
                b-=a
        return b*(2**t)
    

    先除去所有的公约数2,然后不断用较大数减较小数直到两数相等,这个值和最开始除去的所有2相乘就是结果

    求完最大公约数之后abc同时除以它们的最大公约数然后将结果相乘即为答案

    完整代码:

    #短除法
    def gcd1(a,b) :
        t=1
        for i in range(2,min(a,b)+1) :
            while (a%i==0 and b%i==0) :
                t*=i
                a/=i
                b/=i
        return t
    
    #辗转相除法
    def gcd2(a,b) :
        if (a<b) :
            a,b=b,a
        t=a%b
        while t!=0 :
            a=b
            b=t
            t=a%b
        return b
    
    #更相减损法
    def gcd3(a,b) :
        t=0
        while a%2==0 and b%2==0 :
            a/=2
            b/=2
            t+=1
        while a!=b :
            if a>b :
                a-=b
            elif a<b :
                b-=a
        return b*(2**t)
    
    a=int(input())
    b=int(input())
    c=int(input())
    #abc相乘之后除去最大公约数的立方
    print(int(a*b*c/gcd1(gcd1(a,b),c)**3))
    #法1
    #print(int(a*b*c/gcd2(gcd2(a,b),c)**3))
    #法2
    #print(int(a*b*c/gcd3(gcd3(a,b),c)**3))
    #法3
    
    

    完结撒花

  • 1
    @ 2020-09-14 21:00:59

    a=int(input())
    b=int(input())
    c=int(input())
    v=a*b*c
    d=0
    if a<b:
    d=a
    else:
    d=b
    if d<c:
    d=d
    else:
    d=c
    i=d
    e=0
    while i>=1:
    if a%i==0 and b%i==0 and c%i==0:
    e=i
    break
    i=i-1
    print(int(v/(e**3)))

  • 0
    @ 2021-01-15 22:49:21

    import math
    a=int(input())
    b=int(input())
    c=int(input())
    k=min(a,b,c)
    k+=1
    x=1
    y=1
    z=1
    while x!=0 or y!=0 or z!=0:
    {
    k-=1
    x=a%k
    y=b%k
    z=c%k
    }
    w=a/k
    e=b/k
    r=c/k
    d=int(w*e*r)
    print(d)

    • @ 2021-01-15 22:50:21

      大括号是方便阅读没有缩进的程序用的,实际应该去掉

  • 1

信息

ID
1006
难度
8
分类
(无)
标签
(无)
递交数
591
已通过
65
通过率
11%
上传者