C ++最小公约数重写

时间:2011-02-26 13:16:54

标签: 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;
      }
}

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

4 个答案:

答案 0 :(得分:8)

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

即使不是这种情况,你的算法也很慢(gcd(a,b)中的线性)。您应该查看更快的Euclidean algorithm

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

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;
}

重写为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;
}

答案 1 :(得分:1)

int check (int a, int b)
{
    for(int i = 2; i < min(a,b); i++)
        if ((a % i == 0) && (b%i == 0)) //i must be divisible by both numbers
            return i;
    return 1;
}

min() ......好吧,你认为......

答案 2 :(得分:0)

while(i < min(a, b)) {
     ...
}

浮现在脑海中......一旦我大于a或b,就没有必要继续前进。

你的代码还有另一个问题,如果a和b都是素数,它将是一个无限循环;)

编辑:理解你不能使用可分性作为停止条件是非常重要的,否则当两个数字都是素数时,或者如果它们没有公约数时,这会导致无限循环。 / p>

答案 3 :(得分:0)

for(int i = 2; (a % i != 0) || (b%i != 0); ++i)
{
    if( i > a || i > b)//a and b are prime
        return 1;
}
return i;