我创建了一个返回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 循环重写它。
答案 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;