C语言中的贪婪算法

时间:2020-04-10 06:50:22

标签: c cs50

所以我在CS50的过程中开始学习C了2天。在第2周的问题集中,对Greedy算法进行编码面临一个挑战,该算法基本上以最少的硬币量将返还给客户。 这是我在CS50沙箱中编写的解决方案。

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

int main(void)
{
    //Assign value
    int q = 0; int d = 0; int n = 0; int p =0;
    int left;
    int count = 0;
    float change;

    // Promting user for change.
    do
    {
       change = get_float("Change:");
    }
    while(change < 0);

    // Convert cent to dollar.
    int cent = round(change * 100);
    printf("Dollar %i\n", cent);

    //Counting coin
    while(cent >=25)
    {
        q++;
        left = cent - 25;
    }
    while(left >=10)
    {
        d++;
        left = left -10;
    }
    while(left >=5)
    {
        n++;
        left = left -5;
    }
    while(left >=1)
    {
        p++;
        left=left-1;
    }
    count = q + d + n + p;  
    printf("Total coin: %i\n", count);
}

我通过CS50沙箱中的CS50终端运行代码,并得到以下错误:

cash.c:27:10: runtime error: signed integer overflow: 2147483647 + 1 cannot be represented in type 'int'

我知道我的循环超出了将数据存储到int的限制。但是我找不到解决方法。

2 个答案:

答案 0 :(得分:1)

你有这个:

while(cent >=25) 
    q++;
    left = cent - 25;
}

如果cent最初大于25,则此循环会结束吗? cent永远不会改变,所以不会。其他循环很好,因此您所要做的就是也使用与其他循环相同的模式。

答案 1 :(得分:0)

您不需要更改q的类型,即int-对此错误消息完全出现。

问题出在其他地方:

q超出了要保存在int中的有能力值的范围,因为在循环中:

while(cent >=25)
{ 
    q++;
    left = cent - 25;
}

证明条件的值cent永远不会减少,因此循环永远不会终止。您只需将cent - 25分配给leftcent本身不变。

顺便说一句,您不需要left变量。

而是使用:

//Counting coin
while(cent >= 25)
{
    q++;
    cent = cent - 25;
}
while(cent >= 10)
{
    d++;
    cent = cent - 10;
}
while(cent >= 5)
{
    n++;
    cent = cent - 5;
}
while(cent >= 1)
{
    p++;
    cent = cent - 1;
}

此外:

printf("Dollar %i\n", cent);

是不正确的,因为您尝试打印以美分而不是美元为单位的货币:

printf("Change in Cent: %i\n", cent);

更正的代码:

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

int main(void)
{
    //Assign value
    int q = 0; int d = 0; int n = 0; int p = 0;
    int count = 0;
    float change;

    // Promting user for change.
    do
    {
       change = get_float("Change in Dollar:");
    }
    while(change < 0);

    // Convert cent to dollar.
    int cent = round(change * 100);
    printf("Change in Cent: %i\n", cent);

    //Counting coin
    while(cent >= 25)
    {
        q++;
        cent = cent - 25;
    }
    while(cent >= 10)
    {
        d++;
        cent = cent - 10;
    }
    while(cent >= 5)
    {
        n++;
        cent = cent - 5;
    }
    while(cent >= 1)
    {
        p++;
        cent = cent - 1;
    }

    count = q + d + n + p;  
    printf("Total amount of coins: %i\n", count);
}