问题来源
今天写排序算法的时候,遇到了一个问题:
将一个奇数分成两份,第一份向下取整,第二份向上取整,例如7分成两份,第一份为3,第二份是4。
解决过程
这个问题本来应该很好解决,第一份正常除,因为C++本身的运算就是向下取整的,第二份用一下ceil函数,加一个math库就好,代码如下:
int a = 7;//这个就是要分开的数
cout << a / 2 << " "//第一份
<< ceil((double)a / 2);//第二份
但是我脑子抽抽了, 觉得ceil的速度有些慢了,放到排序里面会拖慢整体速度,这个时候,还有一种选择,那就是第二份直接加1,比如这样:
int a = 7;//这个就是要分开的数
cout << a / 2 << " "//第一份
<< a / 2 + 1;//第二份除完直接加1就好了
但是!但是但是,我这个小可爱又开始找茬了 ,觉得这样做不够优雅,有失代码健壮性,顺带再整一个更方便的办法,不用math库,甚至不用if语句就可以向上取整。
办法总比困难多,我突然想到有一个运算符可以代替if,那就是C++的三元运算符"? :"
实现的大概原理就是先判断输入进来的数是否是整数,如果不是整数就直接向下取整(直接double转int就好)然后加1,否则直接输出
话不多说,上代码!
代码
首先,下面这段代码是可以直接插入程序里的,不需要任何额外的头文件和预处理,开盖即食:
double RoundingNum = 123.00001;
cout << (((double)RoundingNum - (int)RoundingNum == 0) ? (int)RoundingNum : (int)RoundingNum + 1);
如果你需要更加优雅的实现方式,可以直接用一个define:
#define RoundNum(RoundingNum) (((double)RoundingNum - (int)RoundingNum == 0) ? (int)RoundingNum : (int)RoundingNum + 1)
这段代码的用法和ceil函数是一样的:
double a = 123.00001;
cout << RoundNum(a);