【算法】【C++】整值函数算法

【看大整数类的时候,一条代码引发的血案】

一、整值函数
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

重要的事说三遍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值