2019中山纪念中学夏令营-Day19 数论初步【GCD(最大公约数),素数相关】

关于GCD的一些定理或运用的学习:

1.

2.二进制算法求GCD

思想:使得最后的GCD没有2(提前把2提出来)

代码实现:

 1 #include <cstdio>
 2 #define int long long
 3 int gcd(int x,int y)
 4 {
 5     int i,j;
 6     if(x == 0) return y;
 7     if(y == 0) return x;
 8     for(i=0;0==(x&1);++i)x>>=1;//x & 1 用来判断x是否为偶数
 9     for(j=0;0==(y&1);++j)y>>=1;//同理,用来消去x,y因子的2
10     if(j<i)i=j;
11     while(1)
12     {
13         if(x<y)x^=y,y^=x,x^=y;//交换x和y的值(等同于swap,只是速度比它快多了(位运算))
14         if(0==(x-=y))return y<<i;
15         while(0==(x&1))x>>=1;//等同于x = x / 2;
16     }
17 }
18 signed main()
19 {
20     int a,b;
21     scanf("%lld %lld",&a,&b);
22     printf("%lld",gcd(a,b));
23 }

 

posted @ 2019-08-19 16:16  XYYXP  阅读(222)  评论(0编辑  收藏  举报