我对 C 很陌生。我来自 python 背景。 我想知道我的代码哪里出了问题。

我正在做 cs50 贪婪问题。 我的代码有什么问题? 它适用于某些数字,但其他数字不起作用。 我试图从用户那里获得输入,询问要返还多少零钱,然后仅使用 $.25、$.10、$.05、$.01 计算我可以返还的最小硬币数量

#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 minimumamountofcoins = 0;
    if (n/.25 >=1){
        do 
        {
            n -= .25;
            minimumamountofcoins++;
        }
        while (n/.25 >= 1);
    }
    if (n/.1 >=1){
        do
        {
            n -= .1;
            minimumamountofcoins++;
        }
        while (n/.1 >=1);
    }
    if(n/.05 >=1){
        do
        {
            n -= .05;
            minimumamountofcoins++;
        }
        while (n/.05 >=1);
    }
    if (n/.01 >=1){
        do
        {
            n -= .01;
            minimumamountofcoins++;
        }
        while (n/.01 >=1);
    }
    printf("The minimum amount of coins is %d\n", minimumamountofcoins);
}

新代码:(完美运行,除非进入 4.2)

#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楼 票数:2 已采纳

由于你没有包括测试用例,我做了我自己的。 以下是您的算法没有返回正确答案的一些情况:

.04、.11、.17、.19、.21、.26、.32 等

这些情况在计算便士的数量时都失败了(在最后的 do-while 循环中),并且它们都比应该返回的硬币少一个。 这是因为浮点数错误。 通过打印语句,我发现在计算最后一分钱的除法时,每次都会发生同样的事情:

n/.01 = 0.99999999

这显然不是故意的,因为这应该等于 1,最后一分钱应该加到总数中。 因此,理论上可行的代码由于浮点数而被破坏。

为避免这种情况,您可以做很多事情,例如将美元和美分分别作为整数进行跟踪,将条件更改为n/.01 >= .9999而不是n/.01 >= 1 ,处理金额您正在计算的整数美分或任何其他数量的钱。

就个人而言,我更喜欢最后一个选项,将金额视为整数美分。 这很容易做到,因为要将美元转换为美分,您只需乘以 100。因此,最简单的方法是使用相同的算法,但使用整数除外。

因此,代码看起来像这样:

int main(){
    float n;
    //code that parses in the amount of money, n now stores that amount
    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);
}

  ask by R_C translate from so

未解决问题?本站智能推荐:

1回复

需要一些 cs50 滤镜灰度的初始方向

我正在尝试解决过滤器灰度的问题,但在开始之前我正在苦苦挣扎。 对于灰度,我们给出的公式是平均 RGB 值,然后使用该值作为每个像素的新 RGB 值。 求平均值后如何更新像素中的值? 我想我可以创建一个 Replace 的布尔值并将其设置为 false,然后在替换后将其设置为 true,但现在我认
1回复

为什么我的 CS50 信用卡检查解决方案只能对一个号码起作用?

我正在处理 PSET1 (CS50) 的 Credit 任务。 我可以让总和正确用于示例编号: 4003600000000014但它不适用于任何其他数字: 378282246310005 作为美国运通 371449635398431 作为美国运通 5555555555554444 作
1回复

为什么我的 CS50 问题集 2 的凯撒解决方案有时会抛出随机字符

我正在 CS50 上的问题集 2 上做凯撒问题,但遇到了一些麻烦。 我已经尝试了下面的代码,但它似乎只为单字符纯文本条目和世界生成随机字符,问好! 请原谅缺乏评论。 我正在 CS50 上的问题集 2 上做凯撒问题,但遇到了一些麻烦。 我已经尝试了下面的代码,但它似乎只为单字符纯文本条目和世
1回复

为什么我的 Caesar 解决方案 (CS50) 是双打大写字符?

我的程序可以正确加密小写字母,但对于大写字母,输出将重复输入字符。 例如,如果我将输入输入为“BARFOO”,我的程序将输出“EBDAURIFRORO”。 代码如下所示。 我在第一个 if 循环中尝试做的是检查大写字母字符。 然后我遍历每个字符,将其转换为字母索引,其中 'A' 的索引为 [0]
2回复

哈佛CS50库,需要帮助,在Mac OS X上安装

我正在从哈佛扩展学校cs50.tv上这门课,并且在此过程中,他们正在使用他们制作的名为cs50的库,可通过此链接下载该库。 https://manual.cs50.net/CS50_Library#Mac_OS 我下载了zip文件并将其解压缩,然后打开终端并通过cd进入库目录,但是每
3回复

CS50 问题集 1(学分)2020 需要帮助

我试图提示用户输入信用卡号并确定它是否是真实的信用卡号,如果是,则是什么类型的信用卡号。 我以为我终于得到了它,但是在执行 check50 时,以下两个输入不产生任何输出: 1234567890 4111111111111113 他们应该给出 INVALID 但我不明白为什么他们
1回复

CS50:Speller (pset5) 产生的输出与工作人员的解决方案完全相同,但 check50 返回许多错误。 发生了什么?

我的拼写程序(pset5 的一部分)运行良好,输出与工作人员的解决方案完全匹配。 但是,当我通过 check50 运行我的程序时,每个脚本我仍然会收到几个错误: 这些错误很奇怪。 我的程序肯定能识别单个字符的单词,例如“a”和“i”,正确使用撇号等。我知道这一点,因为我在我的旁边运行了工作人员的
2回复

CS50贪婪需要建议

我正在做 cs50 问题集“贪婪”。 基本上是询问用户欠多少找零,然后输出可以等于输入金额的最小数量的硬币。 它工作得很好,除了当我输入 4.2 它应该输出 18 时它输出 22。