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()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值