Для начала никогда не используйте поплавок для чего-то, что должно быть точным. Но вернемся к этому позже, поскольку в вашей программе есть еще одна проблема.
А пока предположим, что значение float действительно точное.
Когда вы пишете:
do
{
c++;
...
} while(...);
код в теле будет всегда выполняться хотя бы один раз .
То есть, с вашим кодом, если ввод 1.0
, первый цикл будет выполнен 4 раза, а amount_owed
будет 0.0
.
Когда в течение следующих 3 do-while
вы все равно войдете в тело один раз и выполните c++
(даже если amount_owed
равно нулю). Следовательно, вы получите 7 вместо 4 (4 из первого цикла + 1 из каждого из трех следующих циклов).
Решение заключается в использовании обычного while
вместо do-while
. Как:
#include <stdio.h>
int main(void) {
float amount_owed = 1.0;
int c = 0;
while (amount_owed >= 0.25)
{
c++;
amount_owed = amount_owed - 0.25;
}
while ((amount_owed - 0.1) >= 0)
{
c++;
amount_owed = amount_owed - 0.1;
}
while (amount_owed >= .05)
{
c++;
amount_owed = amount_owed - .05;
}
while (amount_owed >= .01)
{
c++;
amount_owed = amount_owed - .01;
}
printf("%d\n", c);
return 0;
}
Вернуться к использованию float : числа с плавающей точкой не могут представлять каждое число с точностью до 100%. Поэтому при выполнении вычислений с использованием чисел с плавающей точкой вы, скорее всего, увидите некоторые ошибки округления. Поэтому для любого вычисления, которое требует точного результата, вы должны попытаться сделать это, используя целые числа.
Для такой задачи «хитрость» состоит в том, чтобы считать amount_owed
находящимися в единицах наименьших монет, которые у вас есть. Как правило, это означает 100 раз «нормальный» способ мышления об этом. Например, вместо 1.17
вы используете 117
.
Тогда ваш код может быть больше похож на:
#include <stdio.h>
int main(void) {
unsigned amount_owed = 100; // note 100 instead of 1.0
int c = 0;
while (amount_owed >= 25) // note 25 instead of .25
{
c++;
amount_owed = amount_owed - 25;
}
while ((amount_owed - 10) >= 0)
{
c++;
amount_owed = amount_owed - 10;
}
. . .