Python中findGCD函数无法终止,运行终端无响应求排查
问题分析与解决
你的代码陷入无限循环导致终端冻结,核心问题有三个:
1. 变量未更新导致循环无法终止
num/2和num1/2仅执行除法运算,但未将结果重新赋值给原变量,num和num1始终保持初始传入的101和102,永远不会变为1或0,while True循环永远触发不了break。
正确的变量更新写法:
num = num // 2 # 用整数除法,因为处理的是正整数 num1 = num1 // 2
2. 条件判断逻辑完全错误
if num and num1 == 1 or 0:的语法与逻辑均不成立:
- 该表达式运算优先级为:先判断
num1 == 1,再与num做逻辑与,最后与0做逻辑或,结果永远为真(初始num为101,非零值在布尔判断中为True) - 若想表达“num等于1或0,且num1等于1或0”,正确写法是:
if (num == 1 or num == 0) and (num1 == 1 or num1 == 0):
3. 算法逻辑错误
你当前的思路完全不是计算最大公约数的正确方法,除以2的次数相乘的结果和GCD毫无关联。计算GCD最常用的是欧几里得算法(辗转相除法),效率高且逻辑清晰。
正确的GCD实现示例
欧几里得算法版本
def findGCD(num, num1): while num1 != 0: num, num1 = num1, num % num1 print(num) findGCD(101, 102) # 输出1,因为101是质数,和102互质
质因数分解版本(直观但效率稍低)
def findGCD(num, num1): def get_factors(n): factors = {} 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 if n > 2: factors[n] = 1 return factors factors_num = get_factors(num) factors_num1 = get_factors(num1) gcd = 1 for prime in factors_num: if prime in factors_num1: gcd *= prime ** min(factors_num[prime], factors_num1[prime]) print(gcd) findGCD(101, 102) # 输出1
内容的提问来源于stack exchange,提问作者Taha
相关产品推荐
相关产品推荐

