POJ 1004 解题报告

1.题目描述:

http://poj.org/problem?id=1004

2.解题过程

这个题目咋一看很简单,虽然最终要解出来的确也不难,但是还是稍微有些小把戏在里面,其中最大的把戏就是float 输入的精度问题,比如,一种最简单最直观的的解题方案如下:

#include <stdlib.h>
#include <stdio.h>
 
int main()
{
    int sum = 0;
    float cb_this_month;
    for(int i=0;i<12;++i)
    {
        scanf("%f",&cb_this_month);
       // printf("%f
",cb_this_month );
        sum += (int)(cb_this_month*100);
    }
 
    float average = ((int)(sum/12.0+0.5))/100.0;
    printf("$%.2f", average);
 
    return 0;
}

上面的代码看似没有问题,实际问题蛮大,若将程序中注释掉的调试代码加上,可以明显看到,输入的数和实际存入的数是不一样的,如下图:

image

这将导致最后的结果不准确,在online judge这种死抠的系统里面,我想肯定是过不了的,但是没想到确实过得了,估计这就是传说中的水题吧。我想这道题的彻底解决方案应该是将输入当字符串存进来。

原文地址:https://www.cnblogs.com/obama/p/3211771.html