CS50 Greedy Need Advice

梦想与她 提交于 2019-12-04 06:54:38

问题


I am doing the cs50 problem set "Greedy". Basically asking the user for how much change is owed and then outputting the minimum amount of coins that can equal the inputed amount. It works perfectly, except when I input 4.2 it outputs 22 when it should output 18.

#include <cs50.h>
#include <stdio.h>


int main(void)
{
    float n;
    do
    {
        n = get_float("How much change is owed?\n");
    }
    while(n == EOF);

    int cents = (int)(n * 100);
    int minimumamountofcoins = 0;
    if (cents/25 >= 1){
        while (cents/25 >= 1)
        {
            cents -= 25;
            minimumamountofcoins++;
        }

    }
    if (cents/10 >= 1){
        while (cents/10 >= 1)
        {
            cents -= 10;
            minimumamountofcoins++;
        }
    }
    if(cents/5 >= 1){
        while (cents/5 >= 1)
        {
            cents -= 5;
            minimumamountofcoins++;
        }
    }
    if (cents/1 >= 1){
        while (cents/1 >= 1)
        {
            cents -= 1;
            minimumamountofcoins++;
        }
    }
    printf("The minimum amount of coins is %d\n", minimumamountofcoins);
}

回答1:


It looks like this is an issue with the conversion from float to int. When you try to convert from dollars to cents, you do so with this line of code:

int cents = (int)(n * 100);

However, this line of code, for $4.20, is returning a cent value of 419. This is a problem with rounding and floats, as 4.2 * 100 is returning 419.99999999 instead of 420.0000000, and integer casting truncates instead of rounding. This problem also occurs with $4.18, and probably other values as well.

To prevent this, add 0.5 before the cast, like so:

int cents = (int)(n * 100 + 0.5);

This will ensure that the rounding takes place in the proper direction, as you are never off by more that a trivial float error.

Using the math.h library, you could also use the roundf() function, which will work in the case of negative numbers, just in case.

int cents = (int)(roundf(n*100));


来源:https://stackoverflow.com/questions/45744291/cs50-greedy-need-advice

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!