我正在尝试编写欧几里得算法,但是当我在C代码中使用循环时程序崩溃

时间:2019-04-16 11:27:05

标签: c algorithm loops

我正在尝试用C代码编写 Euclidean算法。当我使用do whilefor循环时,程序崩溃:

#include<stdio.h>
int gcd(int a,int b);

int main()
{
    int x,r,y;
    printf("Enter two values:\n");
    scanf("%d%d",&x,&y);
    if(x<y)r=x,x=y,y=r;
    r=gcd(x,y);
    printf("\n\n   Result: %d",r);
    return 0;
}

int gcd(int a,int b)
{
    if(a==0||b==0)
    {
        if(a==0)return b;
        if(b==0)return a;
    }
    else
    {
        for(;;a>0||b>0)//also try with do while loop but problem same
        {
            int x;
            x=a%b;
            a=b;
            b=x;
        }
    }
}

您能否解释一下程序崩溃的原因?我将代码块与gcc

一起使用

3 个答案:

答案 0 :(得分:2)

此:

for(;;a>0||b>0)

是一个无限循环,那么结束条件是中间部分,应该是:

for (; a > 0 || b > 0;)

我怀疑这种条件的逻辑,不是&&吗?

答案 1 :(得分:2)

代替 if(x<y)r=x,x=y,y=r;,您需要执行以下操作:

if(x < y){
    r = x;
    x = y;
    y = r;
}

此外,您需要将条件放在for循环的第二条语句中。代替:

for(;;a>0||b>0)
{
    ...
}

您可以做while(a > 0 && b > 0)。 根据您的熟悉程度,您可以使用以下递归:

int hcf(int a, int b)
{
    if (b == 0)
        return a;
    else
       return hcf(b, a%b);

}

还要注意,您的hcf函数在else块中没有return语句。因此,您将不得不使用条件返回:

if (a == 0) return b;
else return a;

hcf函数的结尾

答案 2 :(得分:0)

此声明

for(;;a>0||b>0)

什么也没做,所以你会无休止的循环。

似乎发生的事情是b变为零,然后您执行a % 0这是非法的并导致崩溃。

请记住,是for循环中的第二条语句是终止循环的条件-不是第三条。所以也许你想要:

for( ; a>0||b>0; )