Сколько элементов можно взять из массива с заданным размером заказа - PullRequest
0 голосов
/ 03 марта 2019

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

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

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

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

Я изменил строку результата внутри или снаружи для for и, если условия, это влияет на результат, но снова на результатыневерны (для данного массива 2100 единиц размера заказа будут принимать все элементы с 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());

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

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

  1. Создайте переменную для хранения текущей суммы денег, которые у вас есть.Поэтому каждый раз, когда вы «покупаете» предмет, вы вычитаете то, что купили.
  2. Я изменил логику, чтобы она работала.В основном, заявление о возврате делит вашу текущую сумму денег на требуемую сумму , чтобы получить часть предмета, которую вы можете купить, а затем ддс количества предметов, которые вы уже купили .
  3. Кроме того, вам нужно иметь еще там.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));
0 голосов
/ 03 марта 2019

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

  • 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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...