我们经常遇到这种场景,一个盒子可以装5台肾6,要偷偷带走21台肾6需要多少个盒子?或者一页纸可以记7个妹子的电话号码,要记20个妹子的电话号码需要准备多少张纸?当然,更现实的可能是web页面上一页显示n条记录,x条记录需要分多少页显示。
要精确计算当然是
double pages = (double)x / n;
你就能得到1.5页或者是3.1415929页这种奇怪的数值了,不过你的老板可能会嫉妒你的算术水平,会要求你得到2或者4的结果,这时候怎么办?难道用
int pages = x / n + 1;
这样吗?貌似看起来可能大概还是能正常工作的,好像解决了这个问题……等等,当x能被n整除的时候好像是不该+1的,这可怎么办呢,代码改成这样吧
int pages = (x % n == 0) ? x / n : x / n + 1;
这回代码果然能用了,只是看起来好像有点复杂,还是使用这个简单的方法吧
int pages = (x + n - 1) / n;
道理很简单,利用整数除法去尾的特点,如果x本来不能整除n加上n-1之后就会使结果加1,如果x本来能够整除n那增加的n-1会被去尾结果保持不变。
PS1:开篇的问题,要记20个妹子的电话需要20张纸,否则你会被妹子打死的。
PS2:如果有355条记录,每页显示113条,需要的页数是3.1415929,这个叫密率,祖冲之的计算结果。
PS3:不用考虑倒数第二种写法与最后一种写法的效率问题,人类可读更重要,程序效率差距微乎其微。
时间: 2024-10-26 17:35:14