我需要编写一个程序,打印两个输入整数的最大公约数,并证明它的正确性。我写了以下内容:
def main():
x = int(input("Enter the first integer: "))
y = int(input("Enter the second integer: "))
print(gcd(x,y))
def gcd(x,y):
if x > y:
smaller = y
else:
smaller = x
for i in range(1, smaller + 1):
if ((x % i == 0) and (y % i == 0)):
gcd = i
return gcd
main()
前提条件显然x
和y
应该是两个整数。后置条件是x
和y
的最大公约数。我需要识别循环不变量,并在初始化后显示它是正常的,它在每次迭代后都保持为真。另外,我想通过使用循环不变来证明后置条件,并证明循环是有限的。
我认为循环不变量是i
总是小于或等于x
和y
,x % i = r
和y % i = s
对于某些整数{ {1}}和r
。这显然适用于每次迭代。循环一直持续到s
和r = 0
,然后终止。由于迭代具有上限,因此保证了有限性。
我的推理是否正确?这证明了循环的正确性吗?
答案 0 :(得分:1)
如果您在进入循环之前将gcd
变量初始化为1
,那么我认为您可以更清楚地说明循环不变量(如果您在2
以上,那么该变量将超过gcd
想)。你的不变量将是:
i
是小于或等于x % gcd == y % gcd == 0
的最大整数,i
。
你的循环结束是因为i == min(x, y)
遍历有限范围(以gcd
结尾)。后置条件是x
是y
和{{1}}的最大公约数,它由循环不变量证明(只要你可以证明两个数字的GCD不大于他们中的较小者。)