贪婪算法找钱问题中由浮点数产生的问题及初步解决方法

问题描述:用最少的零钞找开给出的一个人民币数值。假设人民币共有以下几种面值(元):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元时,它的结果是错误的:

贪婪算法找钱问题中由浮点数产生的问题及初步解决方法_第1张图片

如上图,少了一毛钱,但是当我输入的是0.3元时,却不会出错:

贪婪算法找钱问题中由浮点数产生的问题及初步解决方法_第2张图片

于是我开始进行调试,发现问题的出现是因为输入的56.3在计算机被表示成了如下的数值:


这就是为什么最后会少了一毛钱,但是当输入为0.3时,情况就不一样了:


这就是为什么同样的问题却的出了不一样的答案,为了解决这个问题,我就在上面程序的第9行前加了一句:

sum = sum +0.05;

这样一来,56.3就为成为:


于是就可以得出正确的结果:

贪婪算法找钱问题中由浮点数产生的问题及初步解决方法_第3张图片



你可能感兴趣的:(算法,input,float)