未使用def的两种Python GCD算法调试求助(非欧几里得+欧几里得法)
修正你的GCD求解代码(非欧几里得+欧几里得方法)
我来帮你排查两段代码里的错误,然后给出修正后的可运行版本:
一、非欧几里得方法的问题与修正
你的这段代码有几个关键语法和逻辑错误:
- 把**赋值运算符
=**写成了比较运算符==,比如bound == num2这种写法是在判断相等,而不是给bound赋值 - 变量
GCD没有初始化,而且更新时同样误用了==,应该先把GCD初始化为1(因为1是所有整数的公约数),找到更大的公约数时用GCD = i来更新 - 循环逻辑需要确保记录的是最大的公约数,虽然遍历顺序是从2到bound,但必须先初始化GCD才能正确更新
修正后的代码:
num1, num2 = input("input two integers to find GCD: ").split() num1 = int(num1) num2 = int(num2) # 确定bound为两个数中的较小值 if num1 > num2: bound = num2 else: bound = num1 GCD = 1 # 初始化GCD为最小公约数1 i = 2 while i <= bound: if num1 % i == 0 and num2 % i == 0: GCD = i # 更新为当前找到的更大公约数 i += 1 print("The GCD for %d, %d is %d." % (num1, num2, GCD))
二、欧几里得方法的问题与修正
这段代码的错误集中在变量名拼写和算法逻辑上:
- 变量
temp被误写成tmp,会导致未定义的报错 - 欧几里得算法的循环条件和变量更新逻辑有误,正确逻辑是不断用较大数对较小数取余,直到余数为0,此时的除数就是GCD
- 最后打印的参数顺序错误,循环结束后
num1(或我们替换的临时变量)才是最终的GCD
修正后的完善版本(保留原始输入值用于打印):
num1, num2 = input("input two integers to find GCD: ").split() original_num1 = int(num1) original_num2 = int(num2) a, b = original_num1, original_num2 # 欧几里得算法核心:当余数不为0时继续循环 while b != 0: temp = a % b a = b b = temp print("The GCD for %d, %d is %d." % (original_num1, original_num2, a))
内容的提问来源于stack exchange,提问作者Eunseo Song
相关产品推荐
相关产品推荐

