【看大整数类的时候,一条代码引发的血案】
一、整值函数
1.floor(x)
作用:floor(x)即为小于等于x的最大整数。
2.ceiling(num,significance)
作用:将num舍入到significance为单位的数,原则为向远离原点的方向前进,且num与significance必!须!同!号!
例:ceiling(2.5,2) = 4;
ceiling(2.5,4) = 4;
ceiling(-2.5,-2) = -4;
ceiling(-2.5,2) = 返回错误值;
二、应用
在以下证明中,把ceiling(x)当作ceiling(x,1).
在对n个数分为m组的算法中,可以“强行”利用整值函数的性质,来达到最简地得出想要的效果。
公式:ceiling(n/m) = (n-1)/m+1
其中ceiling(n/m)为要分成的组分,n为待分数。
证明:
1.显然,ceiling((n mod m) / m) = 1;
2.又因为(n mod m + m)<2m,所以,floor((n mod m + m - 1) / m) = 1;
所以ceiling(n / m) = floor((n - 1) / m) + 1;
即首先(n mod m)虽然去掉了,但是两边都是整值函数,不会对等号产生影响,其次将右边的floor括号里的m拿到外面去,得上式。
又因为在C++里,本身除法带有向下取整性,故去掉floor,得:
ceiling(n/m) = (n - 1) / m + 1
看各种书的时候没有关于这个公式的解释,导致很多情况下十分费解,直到今天才终于理解了背后的原因,不知道这是一件好事还是坏事。
记住ceiling(n / m) = (n - 1) / m + 1
记住ceiling(n / m) = (n - 1) / m + 1
记住ceiling(n / m) = (n - 1) / m + 1
重要的事说三遍。