static void Main(string[] args)
{
Console.WriteLine("输入两个整数,求最大公约数");
int a, b;
Stopwatch stopwatch = new Stopwatch();
while (true) {
a = Convert.ToInt32(Console.ReadLine());
b = Convert.ToInt32(Console.ReadLine());
stopwatch.Reset();
stopwatch.Start();
int res = getGYSByQuick(a, b);
stopwatch.Stop();
Console.WriteLine(res + " 用时:" + stopwatch.ElapsedMilliseconds);
}
}
//更向减损术和移位结合
static int getGYSByQuick(int a, int b) {
if (a == b) {
return a;
}
if ((a & 1) == 0 && (b & 1) == 0)
{
//两个都是偶数
return getGYSByQuick(a >> 1, b >> 1) << 1;
}
else if ((a & 1) == 0 && (b & 1) == 1)
{
//a是偶数,b不是
return getGYSByQuick(a >> 1, b);
}
else if ((a & 1) == 1 && (b & 1) == 0)
{
//b是偶数,a不是
return getGYSByQuick(a, b >> 1);
}
else {
//都是奇数,奇数减奇数必为偶
int mid = 0;
int min = 0;
if (a > b)
{
mid = a - b;
min = b;
}
else {
mid = b - a;
min = a;
}
return getGYSByQuick(mid, min);
}
}可以看出如果是偶数的话,可以右移一位(除以2),缩小一半的范围
计算什么都是 0ms