python代码解决简单的欧几里得游戏

规则:在黑板上写两个不相等的正整数,两个玩家依次轮流写出黑板上任意两个数字的差,且差不可以和黑板上的任意一个数字相同,求出可以做差的次数。
想法:
1.若相减结果可以负值,则可以一直进行下去
2.若相减结果不可以是负数,则最终结果为两数中的最大值,间隔为两数的最大公约数,即给出数a,数b,最大公约数为c 最终结果为 c: c: max( a , b ) 分析如下:
a = n * c b = m * c 第一次计算为 a - b = ( n - m ) * c ( a > b ) 则等式两边可同时除以c, 而根据设定 两数之差最小为大于等于1的正整数,易证最终结果中理论最小的数为c,又类比辗转相除的减法表示可以求得最大公约数,则证明最终结果为 c: c: max( a , b )
所以在给出数字时计算其最大公约数,结果( max( a , b ) / c ) -2 次若可以考虑相同数字相减为零的话则为( max( a , b ) / c ) -1 次选择 先后顺序

import random
c = []
count = 0
def randomk():
    return random.randint(0, 50)

def func( x, y, c):
    global count
    if (c[x]-c[y]) <= 0:
        return
    for coord in c:
        if coord ==(c[x]-c[y]):
            return

    c.insert( 0,c[x]-c[y])
    count += 1
    return 5

def main():
    a = randomk()
    b = randomk()
    x = 0
    y = 0
    if a != b :
        c.insert( 0, a)
        c.insert( 1, b)
        while x <=(len(c)-1):
            while y <=(len(c)-1):
                if func( x, y, c)==5:
                    x = 0
                    y = 0
                y += 1

            x += 1
            y = 0
        print(c)
main()

你可能感兴趣的:(python代码解决简单的欧几里得游戏)