【转】C语言中整型运算取Ceiling问题

原文:http://blog.csdn.net/laciqs/article/details/6662472

-------------------------------------------------------

此题来自:《Linux C编程一站式学习》

假设变量x和n是两个正整数,我们知道x/n这个表达式的结果要取Floor,例如x是17,n是4,则结果是4。如果希望结果取Ceiling应该怎么写表达式呢?例如x是17,n是4,则结果是5;x是16,n是4,则结果是4。

网上对这道题只有答案和证明,我们虽然能证明答案的正确性却不知道答案是如何得出的,这篇文章填补了这一空白。

一位高手的推导(根据他的原文整理的):

设x=kn+b,b∈(0, n)且b∈Z,当b=0时,

(x+z)/n=k,即(kn+z)/n=k,根据题目要求,z最大为n-1;

当b≠0时,(x+z)/n=k+1,即(kn+b+z)/n=k+1,也就是(b+z)/n=1,由于b∈(0, n)且b∈Z,故b可取最小值1,此时z为n-1,当b取2时,z为n-2……当b=n-1时,z=1,可见不考虑特殊情况时,z最大为n-1;而当b=n-1时,z若为n-1,则(b+z)/n=2-2/n<2,也就是(kn+b+z)/n<k+2,依然可以取Ceiling。所以无论怎样z都可为n-1,即z=n-1。

∈[1, n-1],∵[

所以这个表达式应该写为:(x+n-1)/n

而且从上面的推导过程可以看出,对于x%n=n-1的情况,只要再给x加上一个1就可以取Ceiling,比如19%4=3,(19+1)/4=5。

时间: 2024-12-23 13:59:26

【转】C语言中整型运算取Ceiling问题的相关文章

C语言的整型溢出问题(转)

整型溢出有点老生常谈了,bla, bla, bla… 但似乎没有引起多少人的重视.整型溢出会有可能导致缓冲区溢出,缓冲区溢出会导致各种黑客攻击,比如最近OpenSSL的heartbleed事件,就是一个buffer overread的事件.在这里写下这篇文章,希望大家都了解一下整型溢出,编译器的行为,以及如何防范,以写出更安全的代码. 什么是整型溢出 C语言的整型问题相信大家并不陌生了.对于整型溢出,分为无符号整型溢出和有符号整型溢出. 对于unsigned整型溢出,C的规范是有定义的——“溢出

基于 CPython 解释器,为你深度解析为什么Python中整型不会溢出

前言 本次分析基于 CPython 解释器,python3.x版本 在python2时代,整型有 int 类型和 long 长整型,长整型不存在溢出问题,即可以存放任意大小的整数.在python3后,统一使用了长整型.这也是吸引科研人员的一部分了,适合大数据运算,不会溢出,也不会有其他语言那样还分短整型,整型,长整型...因此python就降低其他行业的学习门槛了. 那么,不溢出的整型实现上是否可行呢? 不溢出的整型的可行性 尽管在 C 语言中,整型所表示的大小是有范围的,但是 python 代

【C语言】整型溢出和整型提升

什么是整型溢出: C语言的整型问题相信大家并不陌生了.对于整型溢出,分为无符号整型溢出和有符号整型溢出. 对于unsigned整型溢出,C的规范是有定义的--"溢出后的数会以2^(8*sizeof(type))作模运算",也就是说,如果一个unsigned char(1字符,8bits)溢出了,会把溢出的值与256求模.例如: unsigned char x = 0xff; printf("%d\n", ++x); 上面的代码会输出:0 (因为0xff + 1是25

关于c语言中的位运算。。。

位运算是一种针对二进制数的一种运算 位运算 共有六种 都有其对应得操作符号 &      (and)      位于 |        (or)         位或 ~      (not)        取反 ^       (xor)        异或 >>    (shr)    右移一位 <<    (shl)     左移一位 运算说明: === 1. and运算 === and运算通常用于二进制取位操作,例如一个数 and 1的结果就是取二进制的最末位.这可

Java中整型的缓存机制

译文出处: 张洪亮   原文出处:Java Papers 本文将介绍Java中Integer的缓存相关知识.这是在Java 5中引入的一个有助于节省内存.提高性能的功能.首先看一个使用Integer的示例代码,从中学习其缓存行为.接着我们将为什么这么实现以及他到底是如何实现的.你能猜出下面的Java程序的输出结果吗.如果你的结果和真正结果不一样,那么你就要好好看看本文了. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 pa

Python 中整型对象存储的位置

在 Python 整型对象所存储的位置是不同的, 有一些是一直存储在某个存储里面, 而其它的, 则在使用时开辟出空间. 说这句话的理由, 可以看看如下代码: a = 5b = 5a is b # True a = 500b = 500a is b # False 由上面的代码可知, 整型 5 是一直存在的, 而整型 500 不是一直存在的. 那么有哪些整数是一直存储的呢? a, b, c = 0, 0, 0while a is b: i += 1 a, b = int(str(i)), int(

5/30 c语言中的位运算

1.什么是位运算? 位运算是指按二进制位进行的运算.因为在系统软件中,常要处理二进制的问题.储存单元中的各二进制位左移或者右移一位,两个数按位相加等.c语言灵活,接近底层,对程序员的要求高,不像其他语言对c语言进行了封装,出错性会高很多. 2.位运算符和位运算. 运算符&按位与  ~取反 |按位或    <<左移  ^按位或   >>右移.位运算中除了~以外,均为二元元运算符,即要求两侧各有一个运算量. 3.与&的应用. 清零,无论任何一个二进制的书与上一个0000

嵌入式c语言中的位运算

位运算在嵌入中也是一个重要的点,下面就简单介绍和举一些有用的例子,如果有不足的话,请补充,废话不多说,直接开始! 位运算操作符有6个:&,|,^,~,>>,<< &   只有1&1才等于1,其它都为0 |   只有0|0才等于0,其它都为1 ^   异或,相异为1,相同为0,用来检查两个操作数的某对应位是否一致 ~   非,按位反,任何数的非与数本身相加都等于-1(如果不懂的话,请查看下一篇补码) >>  左移,相当乘以2-->左移之后,后

C语言中对数组名取地址

在C/C++中,数组名相当于一个指针,指向数组的首地址.这里"相当于"不代表等于,数组名和指针还是有很多区别的,这个在<C陷阱与缺陷>里有详尽的讲述.而这里要说的是对于数组名取地址的这么一个操作. 如果声明有如下数组: int arr[5]; 那么,&arr这个操作得到了什么值呢? 如果简单的认为arr就是一个指向数组首地址的指针的话,那么很自然会想到&arr得到的是一个指向存放arr这个指针的指针,也就是一个二级指针,然而事实却并不是这样. 观察以下代码: