C++ C++;最小公约数重写

C++ C++;最小公约数重写,c++,math,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++;

我做了一个函数,返回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循环来重写它

while(i
想到。。。一旦我大于a或b,就没有必要再进一步了

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

编辑:理解不能将整除性用作停止条件非常重要,否则当两个数字都是素数或没有公约数时,这可能导致无限循环。

int check(int a,int b)
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;
}
{ 对于(int i=2;i
其中
min()
。。。好吧,你想…

如果a和b是共素数(gcd=1),那么只有当我溢出并达到-1时,你的算法才会终止。i、 e.经过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;
}
重写到一个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;
}
int检查(int a,int b)
{

对于(inti=2;它属于codereview.stackexchange.com您的代码有一个bug。a=3 b=5将产生无穷的错误loop@Jerome我的电脑速度很快。它能在18秒内计算出你的无止境循环。@CodeInChaos;结果是-1?不知道这里是否存在性能问题;-)最小??通常人们对最大公约数(GCD)感兴趣和最小公倍数(LCM)。a和b的无限循环都是素数。@GregS我只在Krtek发表评论时编辑了它。是的,当然,但是对于向帮助询问while循环的人来说,“无限循环”比整数溢出更容易理解;)。使用I返回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;
}
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;