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 = getGYSByXJF2(a, b); stopwatch.Stop(); Console.WriteLine(res + " 用时:" + stopwatch.ElapsedMilliseconds); } } //相减法--递归的方式别用,999999和1?栈会崩的。 static int getGYSByXJF(int a, int b) { if (a == b) { return a; } if (a > b) { return getGYSByXJF(a - b, b); } else { return getGYSByXJF(b - a, a); } } //相减法 不用递归 static int getGYSByXJF2(int a, int b) { while (a != b) { if (a > b) { a = a - b; } else { b = b - a; } } return a; }
思路是大数和小数相加得差,如果这个差和小数不相等,那么这个小数和差的最大公约数就是大数和小数的最大公约数
计算99999999和88888888,时间为0ms
但是如果计算99999999和1,时间为296ms(这就和穷举法差不多了)