C++最小公约数重写

rrr*_*rrr 2 c++ math

我创建了一个返回2个数字的最小公约数的函数.

int check (int a, int b)
{
 int i = 2; //every number is divisible by 1
   begin:
    if ((a % i == 0) && (b%i == 0)) //i must be divisible by both numbers
      {
         return i;
      }
    else
      {
          i++;
          goto begin;
      }
}
Run Code Online (Sandbox Code Playgroud)

但是,我正在使用备受建议的反对goto,所以我想知道如何使用forwhile循环重写它.

Cod*_*aos 8

如果a和b是共素(gcd = 1),则只有在溢出并达到-1时,您的算法才会终止.即经过40亿次迭代.

即使不是这种情况,你的算法也很慢(gcd中的线性(a,b)).你应该研究更快的欧几里德算法.

您的代码处于重写形式(终止问题未修复),因此它等同于您的旧代码:

int check (int a, int b)
{
 int i = 2; //every number is divisible by 1
   while(!((a % i == 0) && (b%i == 0)))//i must be divisible by both numbers
   {
      i++;
   } 
   return i;
}
Run Code Online (Sandbox Code Playgroud)

重写为一个for循环,一旦明确gcd == 1就终止

int check (int a, int b)
{
  for(int i=2;i<=Math.Min(a,b);i++)
  {
    if((a % i == 0) && (b%i == 0))
      return i;
  }
  return 1;
}
Run Code Online (Sandbox Code Playgroud)