Вопросы
while(change_owed <=0);
- это бесконечный цикл, поскольку change_owed
всегда равно 0. Конечно, должно быть while(input <=0);
input = round(input);
имеет мало смысла. round()
не округляется до ближайшего 0,01, но до ближайшего целого числа.
Результат кода всегда будет четверти .
2-й цикл также является потенциальным бесконечным циклом.
Рассмотрим, что происходит, когда input > 0
и input - .01 > 0
ложно -> бесконечный цикл. Обычно это может произойти, когда input = round(input);
исправлено.
while(input > 0)
{
if(input - .25 > 0) // quarters
{ ... }
else if (input - .10 > 0) // dimes
{ ... }
else if (input - .05 > 0) // nickels
{ ... }
else if (input - .01 > 0) // pennies
{ ... }
}
КСТАТИ
Конечно, if(input - .25 > 0)
должно быть if(input - .25 >= 0)
(или лучше if(input >= 0.25f)
. Используйте >=
вместо >
.
Увеличенное изображение. Используйте целые числа.
int main(void) {
//float change_owed;
float input;
long long num_coins = 0;
do {
input = get_float("Amount paid\n");
} while (input <= 0);
long long input_cents = llround(input * 100.0);
// begin checking
while (input_cents > 0) {
if (input_cents >= 25) {
num_coins++;
input_cents -= 25;
} else if (input_cents >= 10) {
num_coins++;
input_cents -= 10;
} else if (input >= 5) {
num_coins++;
input_cents -= 5;
} else if (input >= 1) {
num_coins++;
input_cents -= 1;
}
}
printf("%lld\n", num_coins);
}
Возможна дополнительная эффективность, а не просто num_coins++;
if (input_cents > 0) {
num_coins += input_cents/25;
input_cents %= 25;
num_coins += input_cents/10;
input_cents %= 10;
num_coins += input_cents/5;
input_cents %= 5;
num_coins += input_cents;
}