CS50 第一节课作业:找零算法
在 CS50 课程的第一节课中,我们被要求实现一个用最少硬币数进行找零的算法。该算法需要处理不同面值的硬币,并且保证返回的硬币数是最少的。
项目背景
在日常生活中,找零是一个非常常见的问题。在美国,通常的硬币面值有25美分(quarters)、10美分(dimes)、5美分(nickels)和1美分(pennies)。我们的目标是编写一个程序,给定一个金额,计算出使用最少数量硬币能够找零的方案。
示例
假设输入的金额是 41 美分,最优解应该是:
- 1 个 25 美分硬币
- 1 个 10 美分硬币
- 1 个 5 美分硬币
- 1 个 1 美分硬币
总共 4 个硬币。
算法设计
我们通过贪婪算法来解决这个问题。这个算法的核心思想是每一步都选择当前可以使用的最大面值硬币,然后减去该面值的硬币值,直到找零金额为 0。这个方法能够保证使用的硬币数量是最少的。
代码实现
下面是我们实现该算法的 C 语言代码:
#include <cs50.h>
#include <stdio.h>
int calculate_coins(int n);
int main(void)
{
int n;
int frequency;
do
{
n = get_int("请输入需要找零的金额:");
}
while (n < 0);
frequency = calculate_coins(n);
printf("%i\n", frequency);
}
int calculate_coins(int n)
{
int num = 0;
num += n / 25; // 使用25美分硬币的个数
n %= 25; // 剩余需要找零的金额
num += n / 10; // 使用10美分硬币的个数
n %= 10; // 剩余需要找零的金额
num += n / 5; // 使用5美分硬币的个数
n %= 5; // 剩余需要找零的金额
num += n; // 剩余部分全用1美分硬币
return num;
}
关键步骤解析
- 输入验证:程序会要求输入一个非负整数作为需要找零的金额。如果输入负值,会要求重新输入,直到输入正确为止。
- 贪婪算法计算:
- 首先计算能够使用的25美分硬币的数量,并更新剩余找零的金额;
- 然后计算能够使用的10美分硬币的数量,并再次更新剩余找零的金额;
- 接着计算5美分硬币的数量;
- 最后,所有剩余的金额都用1美分硬币完成找零。
- 输出结果:程序最终输出使用的最少硬币数。
结论
通过这次作业,我们熟悉了用贪婪算法解决实际问题的方法。在编码过程中,确保代码的简洁性和高效性也是一个重要的学习点。同学们可以尝试不同的输入值,来测试和熟悉这个找零算法的行为。
希望这篇博客能够帮助你更好地理解和实现 CS50 第一节课的作业。如果有任何问题,欢迎交流和讨论!