当前位置: 代码迷 >> 综合 >> poj 1079 Ratio 模拟
  详细解决方案

poj 1079 Ratio 模拟

热度:76   发布时间:2024-01-19 05:24:14.0

模拟题,只是涉及分数精度的一个技巧:c++中如何取整?如果a是一个浮点数,int b=(int)a; b是a的整数部分么??

        答案是不一定,因为在一般实际的算法中,不是int b=(int)a这么简单 a可能经过了很多运算,有精度丢失。比如a的真值是8 计算机不小心搞成了7.999999或8.000001这样直接取整就会有问题(假设我们的计算机误差范围不超过1e-6,计算机不能保证浮点运算绝对正确,但是可以保证误差范围) ,但是 如果我们加一个比计算机浮点误差稍大的数,比如1e-5,也就是int b=(int)(a+1e-5) 就会发现不管误差成7.999999到8.000001之间任何值,我们用int b=(int)(a+1e-5)都能得到8.

        说点题外话~

        最近1年因为在网易实习搞javaWeb好久没刷题了,也不是说一点刷题的时间都没有,只是因为平时公司要上班,下班后有点贪玩。。今天刚参加完公司应届生培训,发现很多比自己优秀的人,突然觉得觉得以前打dota和网游真是在虚度光阴。戒了戒了,以后专心朝自己的目标前进吧~~~

代码:

//poj 1079
//sep9
#include <iostream>
#include <cmath>
using namespace std;int gcd(int x,int y)
{return x%y==0?y:gcd(y,x%y);
}bool less_or_equal(double x,double y)
{return fabs(x-y)<1e-9?true:x<y;
}int main()
{int a,b;while(scanf("%d%d",&a,&b)==2){int d=gcd(a,b);a/=d,b/=d;double quotient=a*1.0/b;double max_def=1e9;for(int i=1;i<=b;++i){int x=(int)(quotient*i+1e-9);int y=x+1;if(less_or_equal(fabs(y*1.0/i-quotient),fabs(x*1.0/i-quotient))){double def=fabs(y*1.0/i-quotient);if(!less_or_equal(max_def,def)){printf("%d/%d\n",y,i);max_def=def;}}else{double def=fabs(x*1.0/i-quotient);if(!less_or_equal(max_def,def)){printf("%d/%d\n",x,i);max_def=def;}}}puts("");		}	return 0;
}


  相关解决方案