Софтуерно Инженерство
Loading...
Gdimitrov28 avatar Gdimitrov28 11 Точки

Задача 05 Coins от Programming basics Javascript May, While loop

Здравейте,

Реших си задачата по друг начин, но ми стана интересно какво точно обърках първия път и влязох в някакъв безкраен цикъл. Решението си работи ако му подам 2 или 1 или 0.50 дори ама при число от рода на 2.23 прави проблем. Още на първия ' if ' вместо да ми извади 2 единици ми вади 0.00000002 или нещо такова от числото, което е явно и проблемът. Най - вероятно нещо не съм догледал и е тъпа грешка, но гледам от час вече и ще съм благодарен някой ако ми обясни какво точно става. Благодаря предварително.

 

https://pastebin.com/57a6NjuL

 

willystyle avatar willystyle 1143 Точки
Best Answer

Това е понеже работиш с реални числа и има закръгляне, понеже те не се представят като точни степени на 2, затова например пробвай console.log(0.2 + 0.1) дава 0.30000000000000004 и твоя цикъл влиза в положение >0 no < 0.01 и зацикля безкрай.

За да се избегне този проблем, числата се умножават до целочислени, работи се с тях и накрая се делят, особено когато се работи с пари (но поне е лесно умножаваш по 100). Ето твоето решение, като пропускаш след дадена проверка да връща цикъла в началото, понеже се търсят най-малкия брой монети:

https://pastebin.com/ZCubKKc9

Все пак ще ти предложа рефактор с по-кратък код:

function solve(input) {
    let amount = Math.round(input.shift() * 100);
    let coins = 0;
    while (amount > 0) {
        if (amount >= 200) amount -= 200
        else if (amount >= 100) amount -= 100
        else if (amount >= 50) amount -= 50
        else if (amount >= 20) amount -= 20
        else if (amount >= 10) amount -= 10
        else if (amount >= 5) amount -= 5
        else if (amount >= 2) amount -= 2
        else amount = amount - 1
        coins++;
    }
    console.log(coins);
}

 

0
10/06/2019 19:56:57
Gdimitrov28 avatar Gdimitrov28 11 Точки

Благодаря, въобще не ми беше хрумвало да мисля как се представят числата, мислех, че някъде съм объркал нещо в писането просто. Много ми помогна обяснението.

0