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

给一个负数处理的建议吧

Posted by DongSJ at 2011-09-27 12:41:45 on Problem 3742 and last updated at 2011-09-27 12:44:46
大部分负数表示方法都是弄个单独的int或者bool表示正负,值用绝对值表示,这样做的话在加减时需要频繁的考虑正负,很多时候得不偿失。这里给出一个我想出的方法。当然很可能以前有人给出过了。
首先,不设置单独的变量表示正负。遇到负数该怎么办呢?比如说小数减大数,减出的就是负数,这样按照传统的维护进制的方法,就会不断的从前一位借一。这里注意到借一后前面的数字就会变成-1,9999,9999,...,xxxx,xxxx,后面的xxxx表示有效的数字。可以想象,如果继续借下去,前面就会有无数个9999。
所以我们何不就到此为止,把-1,9999就用-1来表示呢?
于是,得到有符号数的表达方式为:有效数字为n位(当然你照样可以把每一位的进制搞成1000、10000等等,依个人喜好。本人经验搞成10000是个比较合适的值),分别用0,1,2,...,n-2,n-1表示。而p[n]为符号位,0表示正,-1表示负。
最大的不同在于,当p[n]==-1时,后面的数字其实是10^n-num,即整个表达式依然是符合num=p[0]+p[1]*10+...+p[n-1]*10^n-1+p[n]*10^n的!!这个很重要,这意味着我们在运算前不需要考虑数字的正负,只要还按照正常的计算,最后整理的时候看整理到最高位的是0还是-1就可以判断结果的正负了。
虽然效率没有太大的提升,但是代码量减少了很多很多,少了很多复杂的判断,就减少了比赛时出错的几率。好比这个题目,我最后的C++代码仅有13xxB。而且保证格式是常用的,没有刻意的删除缩进空格等等。
哎,可惜周天的时候想到了这个方法,以为这个思路太复杂没有实现,其实一点都不复杂,半小时不到就可以敲出来调试完毕了……

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