• 2020.10.13辗转相除法


    简介:

    辗转相除法,用于求两个整数的最大公因数

    辗转相除法[gcd(x,y)];

    CSP写法

    在CSP-S 2020中,学会写法为:

    int gcd(int u,int v){
          if(v == 0) return u;
          return gcd(v, u % v);
    }
    

    课堂讲法

    今日上课讲法为:

    int m , n , r ;
    	scanf("%d %d",&m,&n);
    	for( r = m % n ; r ; ) {
    		m = n ;
    		n = r ;
    		r = m % n ;
    	}
    	printf("%d",n);
    

    (校内还未讲函数相关内容)

    证明辗转相除法成立:

    对于要取公因数的(x),(y)
    (y>x),则必有:(y=kx+r)(k)(frac{y}{x})的商,(r)为余数)

    1. (r=0),则k为最大公因数,返回值为(frac{y}{x})

    2. (r!=0),则可设最大公因数为(d)
      (y=ad)(x=bd)
      那么可以写为:(ad=kbd+b)(r=ad-kbd=(a-kb)d),则(d)也能整除(r)。所以(d)同时也是(b)(r)的最大公因数。

    • 以此类推,可得:(f=k_1b+r_1)
    • (g=k_2r_1+r_2)
    • (r_1=k_3r_2+r_3)
    • ……
    • 直到得到(r_n=k_{n+2}r_{n+1})
      得到递归为“CSP写法”。则得到(r_n \% r_{n+1} = 0)时等同于(①)情况,返回值为上一位的(r_{n-1} \% r_n)








    完结撒花




    奇怪的东西

    //据说<algorithm>库里有现成的__gcd(x,y)函数?
    

    stl_algo.h

      template<typename _EuclideanRingElement>
        _EuclideanRingElement
        __gcd(_EuclideanRingElement __m, _EuclideanRingElement __n)
        {
          while (__n != 0)
    	{
    	  _EuclideanRingElement __t = __m % __n;
    	  __m = __n;
    	  __n = __t;
    	}
          return __m;
        }
    
  • 相关阅读:
    问题汇总
    Spring boot开发过程遇到的一些小问题
    Java 7 新特性
    I2C总线协议详解
    画布分割算法
    nordic __noinit__变量使用
    RTOS事件组使用流程
    RTOS软件定时器的使用
    RTOS互斥信号量的使用流程
    RTOS优先级翻转
  • 原文地址:https://www.cnblogs.com/Shinomiya/p/13811098.html
Copyright © 2020-2023  润新知