我是C的新手。我来自python背景。 我想知道我的代码出错了。
我正在做cs50贪心的问题。 我的代码出了什么问题? 它适用于某些数字,但其他数字不起作用。 我试图从用户那里得到一个输入,询问要回馈多少更改,然后使用$ .25,$ .10,$ .05,$ .01计算我可以回馈的最小硬币数量。
#include #include 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 %dn", minimumamountofcoins); }
新代码:(除了输入4.2时工作正常)
#include #include 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 %dn", minimumamountofcoins); }
由于您没有包含测试用例,我自己做了。 以下是您的算法未返回正确答案的一些情况:
.04,.11,.17,.19,.21,.26,.32等
这些情况在计算便士的数量时都是失败的(在最后的do-while循环中),并且它们都返回少一枚硬币。 这是因为浮点数的错误。 使用print语句,我发现当计算最终便士的分配时,每次都会发生同样的事情:
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 %dn", minimumamountofcoins); }
以上就是c/c++开发分享学习C,需要一些“Greedy”CS50解决方案的帮助相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/549963.html