я пытаюсь написать евклидов алгоритм, но сбой программы при использовании цикла в коде c - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь написать евклидов алгоритм в C-коде. Когда я использую цикл do while или for, происходит сбой программы:

#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 ]

2 голосов
/ 16 апреля 2019

вместо 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. Так что вам придется использовать условный возврат:

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

в конце hcf функция

2 голосов
/ 16 апреля 2019

Это:

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

- это бесконечный цикл, тогда конечное условие - это средняя часть, оно должно быть:

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

Я сомневаюсь в логике этого условия, не так ли?это будет &&?

0 голосов
/ 16 апреля 2019

Это утверждение

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

ничего не делает, поэтому у вас есть бесконечный цикл.

Кажется, что происходит то, что b становится равным нулю, а затем вы делаете a % 0, что недопустимои вызвать сбой.

Помните, что это второй оператор в цикле for, который является условием завершения цикла - это не третий.Так что, может быть, вы хотели:

for( ; a>0||b>0; )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...