CS50 Cash作业代码理解与实现疑问:贪心算法找零功能
CS50 Cash作业问题解答
你的思路正确性
你的思路完全正确。美国流通的硬币面值(25¢、10¢、5¢、1¢)刚好符合贪心算法的最优性要求——每次优先使用当前最大面值的硬币,最终得到的总硬币数量就是最少的。
关于return操作的解释
return是函数的“输出端口”:当函数执行到return语句时,会立刻终止函数运行,并把return后面的数值传递给调用这个函数的地方。比如主函数里写int cents = get_cents();,就是让get_cents()执行完后,把用户输入的美分数值返回给cents变量;calculate_quarters(cents)则会返回当前美分能换的quarter数量,赋值给quarters变量。
补全所有未实现的函数
以下是符合作业要求的函数实现(适配CS50的C语言代码框架):
1. get_cents()函数
负责获取用户输入的合法非负整数(不能是负数):
#include <stdio.h> #include <cs50.h> // CS50库提供的get_int()函数 int get_cents(void) { int cents; do { cents = get_int("Cents owed: "); } while (cents < 0); // 循环直到输入合法值 return cents; }
2. calculate_quarters()函数
计算当前美分能兑换的最大quarter(25¢)数量:
int calculate_quarters(int cents) { return cents / 25; // 整数除法自动取整,比如30/25=1 }
3. calculate_dimes()函数
计算剩余美分能兑换的最大dime(10¢)数量:
int calculate_dimes(int cents) { return cents / 10; }
4. calculate_nickels()函数
计算剩余美分能兑换的最大nickel(5¢)数量:
int calculate_nickels(int cents) { return cents / 5; }
5. calculate_pennies()函数
计算最后剩余的美分对应的penny(1¢)数量:
int calculate_pennies(int cents) { return cents; // 1¢硬币数量等于剩余美分数 }
主函数的执行逻辑(对应你的思路)
主函数会按顺序调用上述函数,逐步减少剩余美分并累加硬币总数:
int main(void) { // 获取用户输入的美分 int cents = get_cents(); // 计算各面值硬币数量,同时更新剩余美分 int quarters = calculate_quarters(cents); cents = cents - quarters * 25; int dimes = calculate_dimes(cents); cents = cents - dimes * 10; int nickels = calculate_nickels(cents); cents = cents - nickels * 5; int pennies = calculate_pennies(cents); // 输出总硬币数 printf("%i\n", quarters + dimes + nickels + pennies); }
内容的提问来源于stack exchange,提问作者Meliodas
相关产品推荐
相关产品推荐

