O ponto chave é encontrar uma forma de calcular quanto de cada moeda utilizar e armazenar esses valores referentes a quantidade de cada moeda. Uma forma que já utilizamos e podemos aplicar nesse desafio é utilizando objetos.
Como sugerido, podemos usar objetos para armazenar a quantidade de cada moeda a ser retornada. Além disso, podemos utilizar a operação de divisão para descobrir quantas moedas utilizar, pois o quociente da divisão representa a quantidade de moedas (Ex.: Em 318 / 100, o quociente é 3 e o resto 18). No entanto, ao utilizar a divisão precisamos nos certificar de pegar apenas a parte inteira, e para isso podemos utilizar o Math.floor() do próprio javascript, que pega o primeiro inteiro anterior a um número. Um último ponto para nos atentarmos é a questão de utilizar o máximo possível de moedas de alto valor, portanto precisamos fazer todos os cálculos em uma ordem específica, nesse caso em ordem decrescente. Vejamos como ficará o código:
function creditCoins(num) { let rest = num
const coins = { '500': 0, '100': 0, '25': 0, '10': 0, '5': 0, '1': 0 }
coins['500'] = Math.floor(rest / 500)
rest -= 500 * Math.floor(rest / 500)
coins['100'] = Math.floor(rest / 100)
rest -= 100 * Math.floor(rest / 100)
coins['25'] = Math.floor(rest / 25)
rest -= 25 * Math.floor(rest / 25)
coins['10'] = Math.floor(rest / 10)
rest -= 10 * Math.floor(rest / 10)
coins['5'] = Math.floor(rest / 5)
rest -= 5 * Math.floor(rest / 5)
coins['1'] = Math.floor(rest / 1)
rest -= 1 * Math.floor(rest / 1)
return coins
}