简单浮点数除法模拟-hdu-4493-Tutor

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=4493

题目意思:

给小数点后两位的12个月的工资,求出平均工资,输出离小数点后第二位最近的两位小数,尾部零不输出。

解题思路:

这题一开始先除以12的话,有精度损失(比如都是12.4449999999999,结果算出来是12.45,应该是12.44),所以先模拟除以12,得到小数点后的第三位数,大于等于5第二位就进位,否则舍掉。

用a[0]表示12个月收入和的整数部分,a[1]表示第一位小数,a[2]表示第二位小数。然后模拟高精度除法,求出除以12后的第三位小数。

代码:

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#define eps 1e-6
#define INF 0x1f1f1f1f
#define PI acos(-1.0)
#define ll __int64
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;


//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);

int ans[4],a[3];
int main()
{
   int t;

   scanf("%d",&t);
   while(t--)
   {
      double sum=0,tt;
      for(int i=1;i<=12;i++)
         scanf("%lf",&tt),sum=sum+tt;
     // printf("%lf\n",sum);
      a[0]=(int)sum; //整数部分
      a[1]=(int)(sum*10)%10; //第一位小数部分
      a[2]=(int)(sum*100)%10; //第二位小数部分
      //printf("%d %d %d\n",a[0],a[1],a[2]);

      int la=0;
      for(int i=0;i<=2;i++) //求出小数后面第三位
      {
         ans[i]=(a[i]+la*10)/12;
         la=(a[i]+la*10)%12;
      }
      ans[3]=la*10/12;
      if(ans[3]>=5)//进位
      {
         ans[2]++;
         if(ans[2]>=10) //进位
         {
            ans[2]=0;
            ans[1]++;
            if(ans[1]>=10)
            {
               ans[1]=0;
               ans[0]++;
            }
         }
      }
      printf("$%d",ans[0]);
      if(ans[1]) //去掉尾部0
      {
         printf(".%d",ans[1]);
         if(ans[2])
            printf("%d",ans[2]);
      }
      else if(ans[2]) //注意.0几
            printf(".%d%d",ans[1],ans[2]);
      putchar('\n');

   }
   return 0;
}
/*
1.4449999
1.4449999
1.4449999
1.4449999
1.4449999
1.4449999
1.4449999
1.4449999
1.4449999
1.4449999
1.4449999
1.4449999
*/




你可能感兴趣的:(模拟)