Удалите третий ввод из расчета НОД, если оставить его пустым

Я использую следующий код для вычисления НОД трех чисел, предоставленных пользователем:

$('#calc').click(function(){

Math.GCD = function(numbers) {
  for (var i = 1 ; i < numbers.length ; i++){
    numbers[0] = twogcd(numbers[0], numbers[i]);
  }
  return numbers[0];

  function twogcd(first, second) {
    if (first < 0) first = -first;
    if (second < 0) second = -second;
    if (second > first) {var temp = first; first = second; second = temp;}
    while (true) {
        first %= second;
        if (first == 0) return second;
        second %= first;
        if (second == 0) return first;
    }
   }
};

Math.LCM = function(first,second) {
    return first * (second / this.GCD(first, second));
};

var first   = document.getElementById("first").value;
var second   = document.getElementById("second").value;
var third = document.getElementById("third").value;

var numbers = [first,second,third];

var GCDresult = Math.GCD(numbers);


alert(GCDresult);
});

с HTML:

<FORM NAME="calc" method="POST">

<button TYPE="button" ID="calc">CALC</button>
<input type="text" name="stuff[]" class="input-field" id="first"/>
<input type="text" name="stuff[]" class="input-field" id="second"/>
<input type="text" name="stuff[]" class="input-field" id="third"/>

</FORM>

Однако я хотел бы, чтобы эта форма вычисляла НОД как 2, так и 3 чисел в зависимости от того, что вводит пользователь. Таким образом, если поле оставить пустым, поле null будет проигнорировано, и вычисление НОД продолжится с двумя входными данными. Однако я, будучи относительно новичком в JavaScript, не могу понять, как исключить пустое поле.

Скрипт: https://jsfiddle.net/tjj7won4/40/

Как я могу изменить код, чтобы учесть это?


person newbie2015    schedule 22.01.2016    source источник


Ответы (2)


Обновил ваш код. Добавлена ​​проверка на то, что первое поле ввода пусто. Если да, то ему присваивается значение следующего непустого поля ввода.

обновлен JS:

$('#calc').click(function(){

Math.GCD = function(numbers) {
  for (var i = 1 ; i < numbers.length ; i++){
    if(numbers[0]==""){
            $.each($('.inputField'),function(){
          if($(this).val()!=""){
               numbers[0] = $(this).val();
               return false;
          }
        });
    }   
    if(numbers[0]!="" && numbers[i]!=""){
        numbers[0] = twogcd(numbers[0], numbers[i])
    }
  }
  return numbers[0];

 if (numbers[i] === '' || numbers[i] === 0) { 
    numbers[0] = twogcd(numbers[0], numbers[i])
    };
  function twogcd(first, second) {
    if (first < 0) first = -first;
    if (second < 0) second = -second;
    if (second > first) {var temp = first; first = second; second = temp;}
    while (true) {
        first %= second;
        if (first == 0) return second;
        second %= first;
        if (second == 0) return first;
    }
   }
};

Math.LCM = function(first,second) {
    return first * (second / this.GCD(first, second));
};

var first   = $("#first").val();
var second   = $("#second").val();
var third = $("#third").val();

var numbers = [first,second,third];

var GCDresult = Math.GCD(numbers);


alert(GCDresult);
});

обновить ссылку на скрипку

person smirfan    schedule 22.01.2016
comment
Как насчет функции LCM? Math.LCM = function(first,second) { return first * (second / this.GCD(first, second)); }; Я не могу понять, как расширить это на сценарий с двумя или тремя числами. - person newbie2015; 22.01.2016
comment
Это должно помочь: чтобы найти наименьшее общее кратное диапазона чисел%23">stackoverflow.com/questions/31302054/ - person smirfan; 23.01.2016

Отфильтруйте нечисловые значения, прежде чем отправлять их в функцию GCD, что-то вроде

/* Filter out things that don't look like numbers */
var numbers = [first,second,third].filter(function (e, i, a) { /* e = element, i = index, a = array */
    return parseFloat(e); /* Is it numeric? */
});

Demo

$('#calc').click(function(){

Math.GCD = function(numbers) {
  for (var i = 1 ; i < numbers.length ; i++){
    numbers[0] = twogcd(numbers[0], numbers[i]);
  }
  return numbers[0];

  function twogcd(first, second) {
    if (first < 0) first = -first;
    if (second < 0) second = -second;
    if (second > first) {var temp = first; first = second; second = temp;}
    while (true) {
        first %= second;
        if (first == 0) return second;
        second %= first;
        if (second == 0) return first;
    }
   }
};

Math.LCM = function(first,second) {
    return first * (second / this.GCD(first, second));
};

var first   = document.getElementById("first").value;
var second   = document.getElementById("second").value;
var third = document.getElementById("third").value;

/* Filter out things that don't look like numbers */
var numbers = [first,second,third].filter(function (e, i, a) { /* e = element, i = index, a = array */
	return parseFloat(e); /* Is it numeric? */
});

var GCDresult = Math.GCD(numbers);


alert(GCDresult);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<FORM NAME="calc" method="POST">

<button TYPE="button" ID="calc">CALC</button>
<input type="text" name="stuff[]" class="input-field" id="first"/>
<input type="text" name="stuff[]" class="input-field" id="second"/>
<input type="text" name="stuff[]" class="input-field" id="third"/>

</FORM>

person smcd    schedule 22.01.2016