You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

不使用gcd函数实现最简分数化简的替代方法咨询

不使用gcd函数实现最简分数化简的替代方法咨询

My code for it:

from math import gcd

y = int(input()) 
w = int(input())   

g = gcd(y, w)
print(f"{y// g}/{w// g}")

Could there be any other way of solving this problem without using gcd?
I tried thinking of ways. Creating maybe some kind of relation of numerator and denominator that could work as a formula but it wouldn't work for all numbers.

当然有啦!不用内置的gcd函数,我们完全可以自己实现约分逻辑,这里给你几种实用的替代方法:

  • 自己实现辗转相除法(这其实是Python内置gcd函数的底层实现逻辑哦):
    辗转相除法的核心思路是不断用较大数除以较小数,用余数替换较大数,直到余数为0,此时的数就是最大公约数。代码实现如下:

    y = int(input())
    w = int(input())
    
    a, b = y, w
    # 手动实现辗转相除法求最大公约数
    while b != 0:
        a, b = b, a % b
    gcd_val = a
    print(f"{y//gcd_val}/{w//gcd_val}")
    
  • 从较小数向下遍历找公约数
    我们可以从分子和分母中较小的那个数开始,依次往下查找第一个能同时整除两者的数,这个数就是最大公约数,找到后直接停止循环即可,效率也不错:

    y = int(input())
    w = int(input())
    
    min_num = min(y, w)
    gcd_val = 1
    for i in range(min_num, 0, -1):
        if y % i == 0 and w % i == 0:
            gcd_val = i
            break
    print(f"{y//gcd_val}/{w//gcd_val}")
    
  • 质因数分解法
    先把分子和分母分别分解成质因数的乘积,然后找出它们共有的质因数,每个质因数取出现次数最少的幂次相乘,得到的结果就是最大公约数,最后用分子分母分别除以这个数即可得到最简分数:

    def get_prime_factors(n):
        factors = {}
        # 先处理2这个特殊的质数
        while n % 2 == 0:
            factors[2] = factors.get(2, 0) + 1
            n = n // 2
        # 处理奇数质数
        i = 3
        while i*i <= n:
            while n % i == 0:
                factors[i] = factors.get(i, 0) + 1
                n = n // i
            i += 2
        # 如果剩下的数是大于2的质数
        if n > 2:
            factors[n] = 1
        return factors
    
    y = int(input())
    w = int(input())
    
    y_factors = get_prime_factors(y)
    w_factors = get_prime_factors(w)
    
    gcd_val = 1
    # 遍历公共质因数,取最小指数相乘
    for prime in y_factors:
        if prime in w_factors:
            gcd_val *= prime ** min(y_factors[prime], w_factors[prime])
    
    print(f"{y//gcd_val}/{w//gcd_val}")
    

你之前想找通用的分子分母关系公式确实不太现实,因为约分的核心就是找到分子分母的最大公约数,不管哪种方法,本质都是围绕这个核心来实现的,只是具体的实现路径不同而已~

备注:内容来源于stack exchange,提问作者S.M.T

火山引擎 最新活动