欧几里得游戏解析实现

       

首先我们可以写出两个数字来找出规律

第一例: 地板上的数字14  2   游戏结束之后 地板上的数字是:14 12 10 8 6 4 2  这7个数字   这时先写的就会赢

第二例: 地板上的数字为7  5 游戏结束之后 地板上会出现的数字是:7 2 5 3 1 6 4 一共7个数字  这时 先写就会赢

第三例 :  地板上的数字为18 45  游戏结束之后 地板上会出现的数字是:18  45  27  9  36  一共5个数字   这时先写就会赢

........

不知大家有没有发现,地板上出现的数字都是中间某个数的倍数  

第一例:地板上的数都是2的倍数

第二例:地板上的数字都是 1的倍数

第三例:地板上的数字都是9的倍数

再来看一下倍数的基数和原始在地板上的数字的关系:

第一例    14  2   2      个数 7 =14/2

第二例    7   5   1        个数 7=7/1

第三例   18  45  9       个数 5=45/9

可以发现这个倍数的基数就是原始数的最大公倍数  出现在地板上的个数就是地板上的最大值除以他的最大公约数 

欧几里得算法就是专门解决最大公约数的算法的;欧几里得是采用的是辗转相除法:原理如下

如果:a=6 b=4

gcd(a,b)=gcd(b,a%b)【%相当于mod 取余函数】一直到gcd(x,0);那么这两个数的最大公约数就为x

gcd(6,4)=gcd(4,2)=gcd(2,0)===============>所以6和4的最大公约数就是2

gcd实现的代码如下:


传入的值已经是a>b的所以在值传入之前需要手动判断这两个值的大小

所以这整个游戏的思路用代码实现就可以这样

这个是知道了最大公约数和最大值,抛弃0不算 地板上初始的数字为偶数,所以地板上最终的数字是偶数就是后写的会赢,若地板上最终的数字个数就是先写的会赢


所以这个游戏的代码就可以实现了:


计算结果如下:




阅读更多

没有更多推荐了,返回首页