QQK's profileQQK的空间BlogListsNetwork Tools Help

Blog


    February 23

    欧几里德算法计算公约数

    欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理:

    定理:gcd(a,b) = gcd(b,a mod b)

     证明:a可以表示成a = kb + r,则r = a mod b
     假设d是a,b的一个公约数,则有
     d|a, d|b,而r = a - kb,因此d|r
     因此d是(b,a mod b)的公约数
     
     假设d 是(b,a mod b)的公约数,则
     d | b , d |r ,但是a = kb +r 
     因此d也是(a,b)的公约数
     
     因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证
    

    欧几里德算法就是根据这个原理来做的,其算法用C++语言描述为:

        void swap(int & a, int & b)
        {
            int c = a;
            a = b;
            b = c;
        }
        int gcd(int a,int b)
        {
            if(0 == a )
            {
                return b;
            }
            if( 0 == b)
            {
                return a;
            }
            if(a > b)
            {
                swap(a,b);
            }
            int c;
            for(c = a % b ; c > 0  ; c = a % b)
            {
                a = b;
                b = c;
            }
            return b;
        }
    

    % 模运算符

    expression1 % expression2
    计算 expression1 除以 expression2 的余数。如果有任一 expression 参数是非数字值,则模运算符 (%) 尝试将它们转换为数字。expression 可以是数字或转换为数值的字符串。
    模运算结果的符号与被除数(第一个数字)的符号相匹配。例如,-4 % 3 和 -4 % -3 的计算结果都为 -1。
    可用性:Flash Player 4;ActionScript 1.0
    操作数
    expression1 : Number - 数字或计算结果为数字的表达式。
    expression2 : Number - 数字或计算结果为数字的表达式。
    返回
    Number - 算术运算的结果。
    示例
    下面的数值示例使用模运算符 (%):
    trace(12%5); // traces 2
    trace(4.3%2.1); // traces 0.0999999999999996
    trace(4%4); // traces 0
    第一个 trace 返回 2,而不是 12/5 或 2.4,因为模运算符 (%) 仅返回余数。第二个 trace 返回 0.0999999999999996 而不是预期的 0.1,因为在二进制计算中对浮点数精度有限制。