Большой общий делитель с петлями - PullRequest
0 голосов
/ 29 октября 2019

Я думаю, что моя логика неверна, но я не могу понять, где я делаю ошибку. Я пытаюсь найти большой общий делитель, и код определит, что делать, если a больше, чем b, или b больше, чем a.

Я перепробовал много циклов, если, хотя, в конце концов, я удалилвсе, чтобы очистить мой взгляд. Я сделал блок-схему, однако он не идет вместе с моим кодом.

var a = 64;
var b = 12;
var newA;

while(a > b && newA != 0){

    newA = a - b;

    if(newA === 0){

        outputObj.innerHTML = outputObj.innerHTML + "GCD is " + b;
    }
}



    while(a < b && newA != 0){

        newA = b - a;
    }

    if(newA === 0){

        outputObj.innerHTML = outputObj.innerHTML + "GCD is " + a;

    }
  }

Если a равно 64, а b равно 12, GCD равно 4, если a равно 35 и b равно 42, GCD равно 7

1 Ответ

1 голос
/ 29 октября 2019

У вас здесь несколько разных проблем. Это похоже на домашнее задание , поэтому я постараюсь указать вам правильное направление для пары проблем, а не, например, точно сказать, что должен сказать ваш код.

  • В ваших циклах вы никогда не обновите значение a или b.
  • При условии, что это исправлено, ваш код будет либо вычитать a из b несколько раз, либо вычитать b изa много раз. При этом вычисляется остаток от деления одного числа на другое , а не наибольший общий делитель .
    • Могу поспорить, что вам было дано описание алгоритма вычисления наибольшего общего делителя. Прочтите его еще раз, сравнивая, что он делает, с тем, что делает ваш код.

Вот мощный метод для поиска проблем в коде такого рода: попробуйте запустить егов вашей голове , делая вид, что вы компьютер. Пройдите шаг за шагом, делая то, что сделает компьютер. С вашим кодом выше это может начаться так:

  • ОК, у меня есть переменные с именами a и b, значения которых равны 64 и 12. И переменная с именем newA, чье значение еще не было указано.
  • Теперь мне нужно проверить, больше ли a, чем b - да, а затем - равен ли newA нулю.
    • Подождите, я не дал newA значение на данный момент. ( Вы нашли ошибку здесь. Давайте представим, что она исправлена ​​и продолжаем.)
  • Теперь я установил newA равным a-b, что52.
  • Теперь я проверяю, равен ли newA нулю, а это не так, поэтому мне не нужно делать вещи внутри блока if.
  • ОК, такмы сделали одну итерацию цикла while. Вернемся к началу цикла.
  • Теперь мне нужно проверить, больше ли a, чем b - да, а затем - равен ли newA нулю.
    • Подожди, я проверяю то же самое, что и в прошлый раз: ничего не изменилось. Как закончится этот цикл? ( Вы нашли еще одну ошибку здесь.)

И так далее.

...