Python自实现两数GCD:已提取两数约数但无法比对求最大公因子的求助
问题根源
当前代码存在两个关键问题,导致无法完成公共约数筛选:
- 用单个变量
s和z存储约数,每次判断到一个符合条件的约数就会覆盖之前的变量值,哪怕去掉打印逻辑,变量最后也只会存下数值本身,根本无法留存全量约数列表 - 拿到约数后直接打印输出,没有把约数持久存储到可复用的容器中,后续没法对两组约数做交集对比
核心本质是没有把零散的约数结果聚合起来,自然没法做后续的筛选计算
适配现有思路的改造方案
完全不用推翻已经写好的约数提取逻辑,顺着“存全量约数→找公共值取最大”的思路补全即可,完全匹配你初始的实现设计要求:
- 初始化两个空列表,分别存储两个数计算出来的所有约数
- 把原有循环中“拿到约数直接打印、用单变量存值”的逻辑,调整为将符合条件的约数追加到对应列表中
- 遍历第一个数的约数列表做逐值判断,只要当前值同时存在于第二个数的约数列表中,就和当前记录的最大公约数比大小,把更大的值更新为新的公约数即可
改造后可直接运行的完整代码
n1 = int(input("Write the first number")) n2 = int(input("Write the second number")) # 存储两个数的全部约数 divisors_n1 = [] divisors_n2 = [] # 提取n1的约数 for i in range(1, n1 + 1): if n1 % i == 0: divisors_n1.append(i) # 提取n2的约数 for i in range(1, n2 + 1): if n2 % i == 0: divisors_n2.append(i) # 计算最大公共约数 gcd = 1 for num in divisors_n1: if num in divisors_n2 and num > gcd: gcd = num print(gcd)
可选的效率小优化
如果想减少循环遍历的次数,找约数的时候不需要遍历到数值本身,只需要遍历到数值的平方根位置,把成对的约数同时存入列表即可,整个过程的计算逻辑和输出结果不会有任何变化。
内容的提问来源于stack exchange,提问作者Badis Kerdellou
相关产品推荐
相关产品推荐

