问题描述:用最少的零钞找开给出的一个人民币数值。假设人民币共有以下几种面值(元):100,50,10,5,2,1,0.5,0.2,0.1
我自己写的代码如下:
#include <stdio.h> int main() { int value[10] = {0,10,20,50,100,200,500,1000,5000,10000}; int count[10]={0}; printf("please input the money:\n"); float sum; scanf("%f",&sum); int s = (int)(sum*100); for(int i = 9; i>=1; i--) { count[i] = 0; for( ; ; ) { if(s>=value[i]) { count[i]++; s = s - value[i]; } else break; } printf("%d\t%.2f\n",count[i],((float)value[i])/100); if(s < 0) break; } }
但是在运行过程中,我发现当我输入的是56.3元时,它的结果是错误的:
如上图,少了一毛钱,但是当我输入的是0.3元时,却不会出错:
于是我开始进行调试,发现问题的出现是因为输入的56.3在计算机被表示成了如下的数值:
这就是为什么最后会少了一毛钱,但是当输入为0.3时,情况就不一样了:
这就是为什么同样的问题却的出了不一样的答案,为了解决这个问题,我就在上面程序的第9行前加了一句:
sum = sum +0.05;
这样一来,56.3就为成为:
于是就可以得出正确的结果: