欧几里得算法——欧几里得游戏

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

 1 import java.util.Scanner;
 2
 3 /**
 4  * Created by Administrator on 14-7-16.
 5  */
 6 public class EuclidGame {
 7     public static void main(String[] args){
 8         int number=0;
 9         System.out.println("please give the number:");
10         Scanner scanner=new Scanner(System.in);
11         String str=scanner.nextLine();
12         int a=Integer.parseInt(str);
13         str=scanner.nextLine();
14         int b=Integer.parseInt(str);
15         winGame(gcd(a>b?a:b,a<=b?a:b),a>b?a:b);
16     }
17     public static int gcd(int a,int b){
18         int r;
19         while(b!=0){
20             r=a;
21             a=b;
22             b=r%a;
23         }
24         return a;
25     }
26     public static void winGame(int number,int max){
27         if((max/number)%2!=0){
28             System.out.println("the first one wins!");
29         }
30         else {
31             System.out.println("the second one wins");
32         }
33     }
34 }

欧几里得算法——欧几里得游戏,布布扣,bubuko.com

时间: 2024-10-18 16:20:49

欧几里得算法——欧几里得游戏的相关文章

欧几里得 &amp; 拓展欧几里得算法 讲解 (Euclid &amp; Extend- Euclid Algorithm)

欧几里得& 拓展欧几里得(Euclid & Extend-Euclid) 欧几里得算法(Euclid) 背景: 欧几里德算法又称辗转相除法,用于计算两个正整数a,b的最大公约数.                                                                                                                                               --百度百科 代码: 递推的代

欧几里得 &amp;amp; 拓展欧几里得算法 解说 (Euclid &amp;amp; Extend- Euclid Algorithm)

欧几里得& 拓展欧几里得(Euclid & Extend-Euclid) 欧几里得算法(Euclid) 背景: 欧几里德算法又称辗转相除法.用于计算两个正整数a.b的最大公约数. --百度百科 代码: 递推的代码是相当的简洁: int gcd(int a,int b) { return b == 0 ? a : gcd(b, a % b); } 分析: 方法说了是辗转相除法,自然没有什么好介绍的了. . Fresh肯定会认为这样递归下去会不会爆栈?实际上在这里是不会爆栈的,由于递归的层数是

总结——数论:欧几里得算法&amp;扩展欧几里得证明

一 欧几里得辗转相除法算法 设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),又因 r = a mod b,所以 gcd(a,b)=gcd(b,a mod b). 证明:①证明充分性. 设 d 为 a,b 的公约数,记作 d|a , d|b ,即a和b都可以被d整除 又因 r=a-kb , 两边同时除以d,r/d=a/d-kb/d=m,由等式右边可知m为整数, d|r , 即 d 是 (b,a mod b)的公约数, ②证明必要性 设 d 为 b, a mod b

[模板]欧几里得算法/扩展欧几里得

最大公因数(欧几里得算法) $gcd(a,b)=gcd(b\%a,a)$(不一定需要a<b) $gcd(0,b)=b$ 1 inline int gcd(int a,int b){ 2 return a==0?b:gcd(b%a,a); 3 } 扩展欧几里得 寻找$ax+by=gcd(a,b)$的一组解x,y(一定存在整数解) $ax+by=gcd(a,b)=gcd(b\%a,a)=(b-\lfloor\frac{b}{a}\rfloor*a)x'+ay'$ 所以有一组解$x=y'-\lfloo

数论杂谈——欧几里得算法及扩展欧几里得

数学是oi的重要基础,所以说数论在oi中占据了非常重要的地位,因此,学好数学,对于一个oier来说也是非常重要的. oi中的数学,其实也就和数竞并没有什么区别. 欧几里得法辗转相除法求最大公约数 我们可以证明gcd(a,b)=gcd(b,a%b),也就是我国古代数学智慧的结晶,更相损减术.并且一直递归下去,直到b的值为零,最大公约数值即为a.在这里就不给出详细证明了,大家可以代几个数据去验证它一下.谁叫我数学太菜. 代码如下 int GCD(int a,int b) { if(!b) { ret

欧几里得&amp;扩展欧几里得算法

朴素的欧几里得算法大家应该知道 \(gcd(a,b)\)表示a,b的最大公约数 朴素的欧几里得算法其实就是所谓的辗转相除法 辗转相除法 \(gcd(a,b)=gcd(b,a\) \(mod\) \(b)\) 证明如下: \(设r=a\) \(mod\) \(b\) \(=a-\lfloor\frac{a}{b}\rfloor*b\),\(p=gcd(a,b)\); 则\[a=xp,b=yp\] 代入可得\[r=xp-\lfloor\frac{xp}{yp}\rfloor*yp\] 提公因式得\[

欧几里得与扩展欧几里得算法

欧几里得算法:最大公因数\((gcd)\) 该算法基于: \(gcd(a,b)=gcd(b,a\)%\(b)\) 证明: 令\(a\) % \(b = r\), 则 \(a = k * b + r,\) 因此\(r = a - k * b\) 设\(d\)为\(a,b\)的公约数,那么\(d|a, d|b,\) 则\(a - k * b\) 能被\(d\)整除,即\(d|r\),即\(d|(a\) % \(b)\), 因此\(d\)是\(b\) 和 \((a\) %\(b)\)的公约数, 因此\

ACM-欧几里得与拓展欧几里得算法

欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). 递归版算法: 1 int gcd(int a,int b) 2 { 3 if(b==0) 4 return a; 5 return 6 gcd(b,a%b); 7 } 递归优化版: 1 int gcd(int a,int b) 2 { 3 return b ? gcd(b,a%b) : a; 4

扩展欧几里得算法(双六游戏)

题目大意:一个双六上面有向前 向后无限延续的格子, 每个格子都写有整数.其中0号格子是起点,1号格子是终点.而骰子上只有a,b,-a,-b四个整数,所以根据a和b的值的不同,有可能无法到达终点掷出四个整数各多少次可以到达终点呢?如果解不唯一,输出任意一组即可.如果无解 输出-1 思路:这道题用数学方法表述就是求整数x和y使得"ax+by=1",可以发现,如果gcd(a,b)不等于1,显然无解. 反之,则可以用扩展欧几里得算法来求解.  事实上,一定存在整数对(x,y)使得ax+by=g