不使用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




