Сколько элементов может быть взято из массива с заданным размером заказа

#javascript #arrays #for-loop #if-statement

#javascript #массивы #for-цикл #if-оператор

Вопрос:

У меня есть массив, включающий числа, где порядок массива фиксирован.

Я хотел бы посмотреть, сколько элементов я могу взять из этого массива с моим ordersize в JS

Мой код выдает неправильные результаты, например, на 500 единиц можно купить первые 2 элемента и 0,66 от 3-го элемента, так что всего можно взять 2,66, но код выдает 4. За 250 единиц я могу взять 1 элемент полностью и 0,75 от второго элемента, всего 1,75 можно взять, но код выдает 1,5.

Для 300 дает 2, это верно, но обычно дает неверный результат.

Я изменил строку результата внутри или снаружи условий for и if, это влияет на результат, но снова результаты неверны (для данного массива 2100 единиц ordersize будут принимать все элементы с 6 результатами)

 function calculateOrder() {
  var coinArray = [100, 200, 300, 400, 500, 600];
  var orderSize = 500;
  var sum = 0;
  var i = 0;
  for (i = 0; i < coinArray.length - 1; i  ) {
    if (sum < orderSize) {
      sum  = coinArray[i];
    }
    return i   (orderSize - sum) / coinArray[i];
  }
}
document.write(calculateOrder());  

Ответ №1:

Используйте приведенный ниже код. Я исправил несколько вещей для вас.

  1. Создайте переменную для хранения текущей суммы денег, которая у вас есть. Таким образом, каждый раз, когда вы «покупаете» элемент, вы вычитаете то, что вы купили.
  2. Я изменил часть логики, чтобы заставить его работать. По сути, оператор return делит вашу текущую сумму денег на необходимую сумму, чтобы получить ту часть товара, которую вы можете купить, а затемопределяет количество товаров, которые вы уже купили.
  3. Кроме того, вам нужно иметь там else . Else выполняется, когда оператор if приводит к false, поэтому else выполняется, когда у вас недостаточно денег для покупки элемента.
  4. return сбой вашей функции, так что это одна из причин, по которой ваш предыдущий код работал некорректно. Цикл for будет выполняться один раз, а затем прерываться.
  5. for Цикл должен завершиться на coinArray.length . Вы, вероятно, думали, что вам нужно - 1 там, поскольку индекс массива начинается с 0, за исключением того, что цикл for меньше, а не меньше или равен, он закончится на последнем индексе.

 function calculateOrder(orderSize) {
  var coinArray = [100, 200, 300, 400, 500, 600];
  var amountOfMoney = orderSize;
  
  for (var i = 0; i < coinArray.length; i  ) {
    if (amountOfMoney > coinArray[i]) {
      amountOfMoney -= coinArray[i];
    }
    else {
      return i   amountOfMoney / coinArray[i];
    }
  }
}
document.write(calculateOrder(500));  

Ответ №2:

В вашем коде есть три проблемы:

  • for цикл выполняет if инструкцию, затем выполняет return инструкцию, чтобы она всегда возвращалась во время первой итерации.
  • for цикл должен повторяться до тех пор, пока i < coinArray.length
  • Цикл, как написано, повторяется на один раз больше, чем нужно для того, чтобы значение в return операторе было правильным.

Вот версия, которая исправляет эти проблемы:

 function calculateOrder() {
  var coinArray = [100, 200, 300, 400, 500, 600];
  var orderSize = 500;
  var sum = 0;
  var i = 0;
  for (i = 0; i < coinArray.length; i  ) {
    if (sum   coinArray[i] > orderSize) {   // if orderSize is exceeded
      return i   ((orderSize - sum) / coinArray[i]); // 2   (0.66)
    }
    sum  = coinArray[i]; // else add to sum 
  }
}

document.write(calculateOrder());