1.更相减损术
即:辗转相减法。是由我国古代《九章算术》提出的一种求解最大公约数(Grand Central Dispatch)的算法。
代码示例:
int f(int a, int b) {
if (a==b) return a;
if (a<b) { //交换值
a^=b; b^=a; a^=b;
}
a-=b;
return f(a, b);
}
2.辗转相除法
代码示例:
int f_(int a, int b) {
if (a%b ==0) return b;
return f_(b, a%b); //因为对一个数求模结果一定小于第二个操
//作数,因此不需要再排序
}
当然,依靠不需要额外变量的异或运算进行数值交换可以衍生出很多种极为精简的写法,这里不再赘述。
3.两种算法的比较
这里我用这两种算法分别进行了1000次的计算,累计它们迭代的次数总和。
更相减损术的迭代次数总和是67570,而辗转相除法的迭代次数总和是8695。(每次两个函数接收到的数据相同,但数据由随机函数生成)
我们都知道取模肯定会比做减法获得数值上更大的下降率,所以在迭代次数方面后者更低很容易理解。