我正在努力解决哈佛的CS50问题集,并且我发现自己陷入了一个非常基本的贪婪问题,即如果硬币仅以25c,10c,5c的面额提供,则可以找到给定更改的最少数量的硬币。 1C。虽然指针不是真的需要这个问题,甚至有一个单独的功能可能是一个过度杀伤,我试图通过在这里实现它来更好地理解指针,但是,我没有得到'硬币'的所需输出由于某些原因。函数调用之前和之后的printf语句用于调试目的。代码后给出了一个示例输出。
以下是代码:
#include <stdio.h>
#include <cs50.h>
void denomination(float* change, int* coins, int den);
int main(void){
float change;
do{
printf("How much change is owed?\n");
change = GetFloat();
}while(change < 0);
int coins; //number of coins in total to be given in change
if(change == 0){
coins = 0;
printf("%d\n", coins);
}else{
change = change * 100; //converting to cents
denomination(&change, &coins, 25);
printf("Inside else:: Change: %f, Coins: %d\n", change, coins);
denomination(&change, &coins, 10);
printf("Inside else:: Change: %f, Coins: %d\n", change, coins);
denomination(&change, &coins, 5);
printf("Inside else:: Change: %f, Coins: %d\n", change, coins);
denomination(&change, &coins, 1);
printf("Inside else:: Change: %f, Coins: %d\n", change, coins);
printf("%d\n", coins);
}
return 0;
}
void denomination(float* change, int* coins, int den){
int tmp;
tmp = (*change/den);
printf("Temp: %d\n", tmp);
*coins = *coins + tmp;
*change = *change - (tmp*den);
}
这是输出:
How much change is owed?
0.41
Temp: 1
Inside else:: Change: 16.000000, Coins: 134516108
Temp: 1
Inside else:: Change: 6.000000, Coins: 134516109
Temp: 1
Inside else:: Change: 1.000000, Coins: 134516110
Temp: 1
Inside else:: Change: 0.000000, Coins: 134516111
134516111
我不明白为什么'改变'按预期工作,但'硬币'没有。
答案 0 :(得分:1)
while
循环必须保留非零值change
(当达到else
分支时),但coins
仅在{{1}中初始化上面的分支。总的来说,行为是不确定的。
答案 1 :(得分:1)
首先删除函数中的while循环。
void denomination(float* change, int* coins, int den)
{
int tmp;
tmp = (*change/den);
printf("Temp: %d\n", tmp);
*coins = *coins + tmp;
*change = *change - (tmp*den);
}
因为你已经分开所以只能在一次获得硬币总数。
首先,不需要循环。
然后你不得不只删除一个书房,而是要删除总金额,这将是tmp硬币的倍数。
所以纠正了函数中的以下语句。
*change=(*change-(tmp*den));
第二件事初始化硬币变量。
因为我认为这有点垃圾价值。
所以在main中用零初始化它。
int Coins=0;
答案 2 :(得分:1)
我没有看到硬币被初始化的任何地方,它的新值总是依赖于之前的值,这可能是它看起来像它不是指针问题的问题