Проблема, которую вы видите, вызвана ограничениями точности с плавающей запятой . Если вы отлаживаете программу, как я показал ниже на скриншоте, используя onlinegdb (если вы еще не совсем знакомы с использованием GDB в командной строке, вам важно научиться, но, возможно, это может будь хорошим первым шагом). Это довольно тесно связано с https://cs50.stackexchange.com/questions/2259/greedy-c-works-for-all-numbers-except-4-2 (где также есть некоторые рекомендации для потенциальных обходных путей / решений).
Обратите внимание, что значение n
после вычитания первого 0.10
действительно меньше, чем 0.10
, но равно 0.0999998078
, и, следовательно, оно думает, что есть только один цент, а не 2, который вы ожидаете.
Что касается конструктивной критики, ваши отступы немного плохи (не уверен, что это вызвано просто вставкой копии здесь или нет), у вас есть неиспользуемая переменная e
, ваш a
, b
, c
, d
переменные могут быть int
s, не обязательно с плавающей запятой, у вас есть некоторые магические числа, повторяющиеся 0.25
, 0.10
и т. Д., Где они должны быть предварительно объявленными константами или, возможно, даже #define
заявления. Есть и другие вещи, и если вы действительно заинтересованы, вы можете опубликовать на родственном сайте обзор кода после того, как вы сделали все улучшения, о которых вы только можете подумать.