/// <summary>
/// 使用Stein算法求最大公约数
/// </summary>
public static int Gcd(int a, int b)
{
int k = 0;// 记录两原数为2的多少倍。原理:Gcd(ka,kb)==k*Gcd(a,b)。
for (; ; )
{
#region 退出条件
if (a == 0)
{
return b << k;// 等价于b*2^k
}
else if (b == 0)
{
return a << k;// 等价于a*2^k
}
#endregion
if ((a & 1) == 0)// 等价于a%2==0
{
a >>= 1;// 等价于a/=2,即a=a/2
if ((b & 1) == 0)// 等价于b%2==0;a,b都为偶数,否则a为偶数,b为奇数
{
b >>= 1;// 等价于b/=2,即b=b/2
k++;
}
}
else
{
if ((b & 1) == 0)// 等价于b%2==0;a为奇数,b为偶数
{
b >>= 1;// 等价于b/=2,即b=b/2
}
else// a,b都为奇数
{
#region 使b变成更小的一个,即b=Math.Min(a,b)
if (b > a)
{
a += b;// 等价于a=a+b
b = a - b;
a -= b;// 等价于a=a-b;
}
#endregion
a -= b;// 等价于a=a-b
}
}
}
}
求最大公约数
最新推荐文章于 2021-02-16 15:25:31 发布