C程序用循环计数硬币

时间:2015-07-29 06:51:04

标签: c cs50 coin-change

我已经看到这个特别的C程序提到了很多,尽管有一些不同的形式。但是我似乎无法找出问题的根源,或者找到另一个有帮助的答案。除了单个输入外,程序编译甚至正确执行:4.2

程序似乎计算了输入更改所需的最小硬币数量,但4.2除外。它应该输出22而不是18(16个季度,2角钱)。 有什么想法吗?我正在审核在线课程,没有学分/没有学术不诚实问题。

#include <stdio.h>
#include <cs50.h>

int main(void)
{ 

//quarters, dimes, nickels, and total number of coins. a is float input for exact change.

float a;
int q=0;
int d=0;
int n=0;
int p=0;
int i;

//petitioning input
do
  {
  printf("Hello, how much change do I owe you?\n");
  a = GetFloat();
  }
  while(a<=0);

//converting float a to an integer i
i= a*100;

//four 'while' loops checking quarters nickels dimes pennies and adding to coin count while
while(i>=25)
    {
    i=i-25;
    q++;
    }
while(i>=10 && i<25)
    {
    i=i-10;
    d++;
    }
while(i>=5 && i<10)
    {
    i=i-5;
    n++;
    }

while(i>0 && i<5)
    {
    i= i-1;
    p++;
    }

//printing sum of each coin type 
  {
  printf("%d\n", q+d+n+p);
  }
return 0;    
 }

3 个答案:

答案 0 :(得分:3)

你刚被floating point precision伪造。

你宣布了

float a;

所以,当

a = 4.2; // say

看起来像

a = 4.19999981

因此,i= a*100;419分配到i而不是420(您所期望的)。

解决方案您需要convert 浮动 a进入整数

(int)(x + 0.5)

所以,而不是i= a*100尝试

i= a*100 + .5;

答案 1 :(得分:2)

许多数字无法在浮点数中正确表示。 4.2可能存储为4.19999999或类似的东西。

从float到integer的转换不正确,可能导致舍入错误:

//converting float a to an integer i
i= a*100; 

在你的情况下,4.2的数字变为419美分。

将其更改为:

//converting float a to an integer i
i= a*100 + 0.5f; 

有关详细信息,请阅读以下文章:

What Every Computer Scientist Should Know About Floating-Point Arithmetic, by David Goldberg

答案 2 :(得分:1)

我不知道GetFloat()是什么,但您必须考虑4.2的浮动表示形式为4.19999981。 您可以测试它添加printf("a=%.8f", a);

然后当你&#34;转换&#34; float to int i的值为419

计算硬币的代码效果很好,您的输入不是您认为的。

THIS可以帮助您理解betetr float to int conversion。