Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

貌似这样要用__int64才能AC…

Posted by HeadHunter at 2013-05-06 18:16:00 on Problem 1079 and last updated at 2013-05-06 18:16:39
In Reply To:教大家一个不使用浮点数的方法 Posted by:aoxboxcox at 2009-04-01 13:43:45
WA了好几次不明所以,然后把所有的int改成__int64,把%d改成%lld就过了

感觉是由于中间计算的越界,就是这句:if(q2*abs(a*q1-b*p1)<q1*abs(a*q2-b*p2))

但是目前还没找到越界的例子……

> 晕,怎么这么多人在使用double,而且还有讨论精度的问题。
> 不过,我也相信不少人看了标题就知道我要说什么了。
> 知道的人就不用往下看了,直接点返回吧。
> 
> 
> 
> 
> 
> 不知道的继续。
> (1)假设假设输入是a/b,需要近似成p/q
> 在知道q的情况下,怎么求p?
> 很简单:p=(double)(q*a)/(double)b+0.5;
> 这是唯一需要在中间过程加入浮点转型的。
> 
> (2)假设输入是a/b,已经近似成p/q
> 在a,b没有约分的情况下,怎么判断a/b=p/q?
> 也很简单:if(a*q==b*p)
> 
> (3)假设输入是a/b,近似成p1/q1和p2/q2
> 怎么判断p1/q1比p2/q2更接近a/b?
> |p1/q1 - a/b| < |p2/q2 - a/b|
> <==>|a*q1-b*p1|/(b*q1) < |a*q2-b*p2|/(b*q2)
> <==>q2*|a*q1-b*p1| < q1*|a*q2-b*p2|
> 所以是:if(q2*abs(a*q1-b*p1)<q1*abs(a*q2-b*p2))
> 
> 
> 可以了,现在这道题目已经变得超简单了,各位继续吧。

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator