免费样机素材网站,食品饮料网站源码,村级网站建设 不断增强,书法网站模板下载先看两个简单的数学问题#xff1a; 一个青蛙跳跃一次的长度为3#xff0c;现在它垂直于马路方向要跳跃整条马路。假定马路的宽为x长#xff1f; 问#xff1a;它最少需要跳跃几次能够完全跳过这条马路#xff1f; 一个房间可以住6个人#xff0c;现在来了一群人#x…先看两个简单的数学问题 一个青蛙跳跃一次的长度为3现在它垂直于马路方向要跳跃整条马路。假定马路的宽为x长 问它最少需要跳跃几次能够完全跳过这条马路 一个房间可以住6个人现在来了一群人人数为x问最少需要多少个房间才能让这x个人都可以住下 假设一个房间住满的情况下才安排另外一个房间。
问题分析
假设马路的长度是10青蛙一次跳3跳3次的距离是9 4次的距离是12为了能完全跳过马路需要跳跃4次
10/3 1 4如果马路的长度是12为了能完全跳过马路需要跳跃4次
12/3 4如果马路的长度是13需要5次才能完全过去:
13/3 1 5 所以这两个题目 都是同样的道理不难得出结论:
result (x%n 0) ? (x/n) : (x/n 1)三目运算可以解决此类问题但针对此类问题有一个较为巧妙的算法公式 分子是总量加上步长减去1 运算后的结果再去除以步长
result xn-1/ n计算机中的整数运算是向下取整的也就是如果能整除没有余数那结果正好如果不能整除有余数就将余数舍弃保留相除后的整数部分。但此时正好和我们想要的结果向上取整相差一正确的结果需要加上这个一。
下面是对这个公式的分析 因为x/n的余数计为z总小于n这样就能保证余数(z n-1) 2n所以z (n-1)/n的值不是0就是1如果z 0z (n-1)/n 0 如果z 0z (n-1)/n 1。 所以result xn-1/ n就能保证如果xn-1的余数等于n-1x/n刚好能够整除余数z是0向上取整不需要加1如果xn-1的余数大于n-1那么x/n不能整除有余数(z)向上取整就需要x/n 1这里的1就是(zn-1)/n 1。
所以在C语言中ceil函数可以使用以下公式
int ceil(int x, int y) {return (x y - 1) / y;
}这个公式的原理和上面提到的一样当x除以y时如果x不能被y整除那么向上取整后的结果应该是x除以y的商加上 1。
结合移位运算-实例分析
假设收到比特流157位利用位运算如何得出占据多少个字节。
157 7 3得到20字节
// 157 7 3的二进制过程为用8位表示 10011101111
--------------101000003
--------------0001010020对157/8向上取整的做法157除以8如果有余数就对结果1。
这里位运算的思想是除以8在位运算中就是右移3位丢掉最后的3位。因为是向上取整所以如果最后3位中只要有一个1就不能单纯地丢掉这3位。都需要将第四位1表现出来的形式就是7。
看一下7的二进制表示就很明显了7的二进制是0b111如果某个数的最后3位只要有一个1再加上7那么最终都会进位导致这个数的最后第四位1实现了向上取整的效果。然后再右移3位实现了除法的效果。 参考
向上取整