我试图研究哈佛的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
我不明白为什么“变化”如我所愿,而“硬币”却不起作用。
发布于 2014-09-16 22:35:31
首先删除函数中的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);
}
因为你已经除以了,所以一次只能得到硬币的总数。
因此,首先,不需要循环。
然后,而不是只移除一个巢穴,你必须删除总金额,这将是多吨硬币将被给予。
因此,在您的函数中更正了以下语句。
*change=(*change-(tmp*den));
第二件事是初始化硬币变量。
因为我认为它给了我们一些垃圾价值。
所以用主值为零来初始化它。
int Coins=0;
发布于 2014-09-16 22:34:40
while
循环必须保留change
的非零值(当到达else
分支时),但是coins
只在上面的if
分支中初始化。总的来说,这种行为是不明确的。
发布于 2014-09-16 22:37:24
我看不出硬币是初始化的,它的新值总是依赖于以前的值--这就是我认为的问题,就像它不是指针问题一样。
https://stackoverflow.com/questions/25883660
复制相似问题