希言自然吧 关注:814贴子:11,488
  • 9回复贴,共1

欧几里得游戏

只看楼主收藏回复

题目:一开始,板上写有两个不相等的正整数.两个玩家交替写数字,每一次,当前玩家都必须在板上写出任意两个板上数字的差,而且这个数字必须是新的(且为正),也就是说,不能与板上任何一个已有的数字相同.当玩家再也写不出新数字时,他就输了.请问,你是选择先行动还是后行动呢?


IP属地:北京1楼2015-12-03 22:25回复
    解决方法:设最初两个数较大的为a, 较小的为b,两个数的最大公约数为c。
    则最终能出现的数包括:c, c*2, c*3, ..., c*(a/c)=a. 一共a/c个。
    如果a/c是奇数,就选择先行动;否则就后行动
    代码:
    #include <stdio.h>
    int gcd(int a,int b){
    if(b==0) return a;
    gcd(b,a%b);
    }
    int main(){
    int a,b,c;
    scanf("%d%d",&a,&b);
    c=gcd(a,b);
    a=a>b? a:b;
    a/=c;
    if(a%2==0)
    printf("two");
    else
    printf("one");
    return 0;
    }


    IP属地:北京2楼2015-12-03 22:30
    回复
      分析:这类题目同上面发的题目有类似的地方,均无算法可直接套,需发现潜在规律,不防弄几个数小的试试.我例举几对数:13和3,15和12,大家不防将这两对数所能产生的数全写出来,这样会发现一个规律,15和12所产生的数为3,6,9,12,15,共5个数,而且都为3的整数倍,可以发现15和12有个最大公约数3,其实这就是1个条件,即所两数A,B之间存在最大公约数X(X>1),那么中间所有数为{x,2x,...,max{A,B}};再看13和3,和上面类比,这对数最大公约数为1,那么相减过程必定会产生1,通过1即能产生从1到max(A,B)之间所有连续的整数,所以该过程产生的所有数为{1,2,...,max{A,B}};到这里两种条件均出来了,对于第一种情况元素个数为max{A,B}/X,后一种为max{A,B}/1,那么只需要再两种不同情况下分别考虑产生的元素个数奇偶即可,程序就不发了啊.如果有兴趣可以试着把题目中我附加的条件去掉,可以发现,除0外的所有整数均是关于原点对称出现的,即正负同时出现,扩展开来就是可以产生所有整数,此题不再有意义.


      IP属地:北京3楼2015-12-03 22:30
      回复
        卧槽C语言Σ(っ °Д °;)っ


        IP属地:北京来自Android客户端4楼2015-12-09 00:52
        收起回复
          卧槽(#啊!)


          来自手机贴吧5楼2015-12-18 21:16
          回复
            http://blog.cntv.cn/20409129-3997348.html


            IP属地:北京6楼2016-01-22 11:13
            回复
              学霸然


              来自Android客户端7楼2016-01-27 12:54
              回复
                我说我会你信吗


                IP属地:天津来自Android客户端8楼2016-02-01 07:58
                收起回复