Как получить обмен монетами двух номиналов? - PullRequest
1 голос
/ 29 мая 2020

Разработайте метод change(amount), который для любого целого числа в диапазоне от 24 до 1000 возвращает список, состоящий только из чисел 5 и 7, так что их сумма равна количеству. Например, change(28) может возвращать [7, 7, 7, 7], а change(49) может возвращать [7, 7, 7, 7, 7, 7, 7] или [5, 5, 5, 5, 5, 5, 5, 7, 7] или [7, 5, 5, 5, 5, 5, 5, 5, 7].

Я написал что-то вроде этого. Но это работает неправильно.

enter code here

def change (amount):
assert (amount >=24)
if amount == 24:
    return [5, 5, 7, 7]
if amount == 29:
    return [5, 5, 5, 7, 7]
if amount == 40:
    return [5, 5, 5, 5, 5, 5, 5, 5]


coins = change(amount - 5)
coins.append(5)
return coins

для монет в диапазоне (24, 1000): print (монеты)

1 Ответ

0 голосов
/ 29 мая 2020

На самом деле вы должны найти два числа:

  • количество монет со значением 7 (пусть это будет countA ) и
  • количество монет со значением 5 (пусть будет countB )

Как видите 0 <= countA <= sum/7. Тогда sum - countA * 7 следует разделить на 5 без остатка .

Итак, простая реализация в java может быть такой:

import java.util.Collections;
// ... 
public List<Integer> getExchange(int sum)
{
   int coinA = 7;
   int coinB = 5;

   int maxCountOfCoinA = sum / coinA;
   int countA = 0;
   int countB = 0;
   for (int count = 0; count <= maxCountOfCoinA; count++)
   {
      int remains = sum - count * coinA;
      if (remains % coinB == 0)
      {
         countA = count;
         countB = remains / coinB;
         break;
      }
   }

   List<Integer> result = new ArrayList<>();
   result.addAll(Collections.nCopies(countA, coinA));
   result.addAll(Collections.nCopies(countB, coinB));
   return result;
}
...