使贪婪算法适用于每个输入

时间:2016-10-03 22:37:42

标签: c cs50

我为cs50的贪婪算法编写了一个代码。它适用于0和1之间的输入。如何使其适用于4.2,6.5,8等输入?我在下面列出了我的代码。我应该在程序中修改什么?

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

int main()
{
    int count , change;
    float cents;
    printf("Enter the change amount : ");
    cents = GetFloat();
    cents = cents * 100;
    change = round(cents);
    count = 0;

    while(cents < 0 )
    {
        printf("Enter a positive number : ");
        cents = GetFloat();
    }

    while (change >= 25)
    {
        change = change - 25;
        count++;
    }

    while (change < 25 & change >= 10)
    {
        change = change - 10;
        count++;
    }
    while (change < 10 & change >= 5)
    {
        change = change - 5;
        count++;
    }
    while (change < 5 & change >= 1)
    {
        change = change - 1;
        count++;
    }

    printf("Total number of coins used : " );
    printf (" %d " ,  count );
    printf("\n");

}

1 个答案:

答案 0 :(得分:0)

我相信你的问题是你正在使用按位逻辑运算符。您应该在比较中使用&&来比较两个表达式的值。还有其他一些小问题:保证正输入的循环应该将cents乘以100和round(),然后再分配这个新值。但是,您实际上并不需要changecents。而且你不需要像你所写的那么多的比较,如果没有额外的比较,你就不需要首先给你带来麻烦的逻辑运算符!

修改

我注意到像4.20之类的数字首先被舍入,然后乘以100!当然这是错误的,为4.204.754提供了相同的结果。我相应地更改了下面的代码,但是您的原始代码正确地执行了此部分(除了在输入验证循环中,如前所述)。现在程序正确处理了这些输入。

这是一个已清理的版本(我没有cs50.h库,因此存在一些小差异):

#include <stdio.h>
#include <math.h>

int main(void)
{
    int count;
    float cents;

    printf("Enter the change amount: ");
    scanf("%f", &cents);
    cents = (float)round(cents * 100);
    count = 0;

    while (cents < 0) {
        printf("Enter a positive number: ");
        cents = (float)round(cents * 100);
    }

    while (cents >= 25) {
        cents -= 25;
        count++;
    }
    while (cents >= 10) {
        cents -= 10;
        count++;
    }
    while (cents >= 5) {
        cents -= 5;
        count++;
    }
    while (cents >= 1) {
        cents -= 1;
        count++;
    }

    printf("Total number of coins used: %d\n", count);

    return 0;
}