http://blog.csdn.net/yingbinchina/archive/2008/07/26/2715549.aspx
留着以后读
我们对C的%
运算知多少呢?
当是正整数时,可能大家都知道。例如:5%3等于2, 3%5等于3。
当
存在负数时呢?先看看例子:
例一:
int main()
{
int x;
x = -6%5; printf("%2d\n",x);
x = 6%-5;
printf("%2d\n",x);
x = 1%-5; printf("%2d\n",x);
x
= -1%-5; printf("%2d\n",x);
x = -6%-5; printf("%2d\n",x);
}
运
行结果为:
-1
1
1
-1
-1
例二:
#include <stdio.h>
int
main()
{
int x;
x = 5%-6; printf("%2d\n",x);
x = -5%6;
printf("%2d\n",x);
x = 4%5; printf("%2d\n",x);
x
= -4%-5; printf("%2d\n",x);
x = -5%-6; printf("%2d\n",x);
}
运
行结果为:
5
-5
4
-4
-5
你看出规律了吗?我帮你总结一下:
余数的定义:当被除数不够整除时余下的数。
当都是正整数时:
除法实际可转化为减数,不够减时剩下的就是余数。
例如:12%5
12-5-5
2
当存在负数时:
x%y
i. 当异号时:
if |x|>|y|
result: x+y
else
result: x
例:
-6% 5等于-1
6%-5等于 1
5%-6等于 5
-5% 6等于 -5
ii. 当同号时:
if |x|>|y|
result: x-y
else
result: x
例:
-1%-5等于-1
-6%-5等于-1
-4%-5等于-4
-5%-6等于-5
相信当你记住这个规律后,再遇到这种问题,你不用思考就可以回答出来。
但你一定不会满意,因为这不是你想要的
结果,你一定觉得还有更深层的
原因。如果你感兴趣,请接着看:
例三:
#include <stdio.h>
int
main()
{
int x;
x = -6/5; printf("%2d\n",x);
x = 6/-5;
printf("%2d\n",x);
x = 1/-5; printf("%2d\n",x);
x
= -1/-5; printf("%2d\n",x);
x = -6/-5; printf("%2d\n",x);
}
运
行结果:
-1
-1
0
0
1
例四:
#include <stdio.h>
int
main()
{
int x;
x = 5/-6; printf("%2d\n",x);
x = -5/6;
printf("%2d\n",x);
x = 4/5; printf("%2d\n",x);
x
= -4/-5; printf("%2d\n",x);
x = -5/-6; printf("%2d\n",x);
}
运
行结果:
0
0
0
0
0
这两个例子我想大家都觉得很简单,但简单并不代表它没价值,
特别是它
和其它事物联系其来时你才会注意到。
“/”在我们这些程序中代表整除,它符合除法法则,异号抵消。
再看看我们余数的定义
:
整除“余”下的“数”。
则有:余数=被除数-商*除数
商就是我
们整除的结果。
看例子:
eg1:
(-6%5) = -6 - (-6/5)*5
(-6%5) = -6 - (-1)*5
(-6%5) = -6 - (-5)
(-6%5) =
-6+5
(-6%5) = -1
eg2:
(5%-6) = 5 -
(5/-6)*(-6)
(5%-6) = 5 - (0)*(-6)
(5%-6) = 5 -
0
(5%-6) = 5
eg3:
(-5%-6)= -5 - (-5/-6)*(-6)
(-5%-6)= -5 - (0)*(-6)
(-5%-6)= -5 - 0
(-5%-6)=
-5
eg4:
(6%-5) = 6 - (6/-5)*(-5)
(6%-5) = 6
- (-1)*(-5)
(6%-5) = 6 - 5
(6%-5) = 1
到现在为
止,你还有什么疑惑?
但我还是有点不明白,这是数学中的定义吗?
我查了一下《Concrete Mathematics》,请看原文:
摘
之 P82
------------------
3.4 ‘MOD': THE
BINARY OPERATION
The quotient of n divided by m is [n/m],when m
and n are positive
integers. It's handy to have a simple notation
also for the remainder
of this division, and we call it 'n mod m',
The basic formula
n = m[n/m]+ n mod m
//NOTE:"m[n/m]" is
quotient, "n mod m" is remainder
tells us that we can express n mod m
as n-m[n/m] .We can generalize this
to megative integers, and in
fact to arbitrary real numbers:
x mod y = x - y[x/y], for y!=0.
--------------------
从
文中可能看出,数学中的 余数(remainder) 其实就是 取模(mod),即:
x mod y = x%y
x%y = x - y[x/y], for y!=0.
数学中的余数概念和我们的计算机中的余数概念一致,但实现却不一致。
其
中 [x/y] 代表的是 x/y 的最小下界。
例:
-3 mod 2 = -3 - 2*[-3/2]
= -3 - 2*[-1.5]
= -3 - 2*(-2)
= -3 + 4
= 1
而我们的计算机是怎么做的呢:
-3%2 = -3 - 2*(-3/2)
= -3 -
2*(-1)
= -3 - (-2)
= -1
所以计算机中的取余实际上是:
x%y = x - y(x/y), for y!=0.
这就是二者的区别。这个区别,对于正数,二者计算出的结果是相等的,但是负数就不相等了。这就意味着,如果以后在使用数学中余数相关定理的时候,要注意计
算机中余数的计算和数学定义不是完全一致的,所以在计算机上,对于负数,数学定理并不完全适用。当然,对于正数,二者是没有区别的。至于为什么计算机上要
这么实现,我想恐怕还是历史原因,最早的计算机如果这样计算除法(取余是靠除法来完成的),那么就涉及到浮点数的计算以及取下界,这样,将比较大的降低效
率,所以实现成了这样的方式,一直沿用至今。
我们对C的%
运算知多少呢?
当是正整数时,可能大家都知道。例如:5%3等于2, 3%5等于3。
当
存在负数时呢?先看看例子:
例一:
int main()
{
int x;
x = -6%5; printf("%2d\n",x);
x = 6%-5;
printf("%2d\n",x);
x = 1%-5; printf("%2d\n",x);
x
= -1%-5; printf("%2d\n",x);
x = -6%-5; printf("%2d\n",x);
}
运
行结果为:
-1
1
1
-1
-1
例二:
#include <stdio.h>
int
main()
{
int x;
x = 5%-6; printf("%2d\n",x);
x = -5%6;
printf("%2d\n",x);
x = 4%5; printf("%2d\n",x);
x
= -4%-5; printf("%2d\n",x);
x = -5%-6; printf("%2d\n",x);
}
运
行结果为:
5
-5
4
-4
-5
你看出规律了吗?我帮你总结一下:
余数的定义:当被除数不够整除时余下的数。
当都是正整数时:
除法实际可转化为减数,不够减时剩下的就是余数。
例如:12%5
12-5-5
2
当存在负数时:
x%y
i. 当异号时:
if |x|>|y|
result: x+y
else
result: x
例:
-6% 5等于-1
6%-5等于 1
5%-6等于 5
-5% 6等于 -5
ii. 当同号时:
if |x|>|y|
result: x-y
else
result: x
例:
-1%-5等于-1
-6%-5等于-1
-4%-5等于-4
-5%-6等于-5
相信当你记住这个规律后,再遇到这种问题,你不用思考就可以回答出来。
但你一定不会满意,因为这不是你想要的
结果,你一定觉得还有更深层的
原因。如果你感兴趣,请接着看:
例三:
#include <stdio.h>
int
main()
{
int x;
x = -6/5; printf("%2d\n",x);
x = 6/-5;
printf("%2d\n",x);
x = 1/-5; printf("%2d\n",x);
x
= -1/-5; printf("%2d\n",x);
x = -6/-5; printf("%2d\n",x);
}
运
行结果:
-1
-1
0
0
1
例四:
#include <stdio.h>
int
main()
{
int x;
x = 5/-6; printf("%2d\n",x);
x = -5/6;
printf("%2d\n",x);
x = 4/5; printf("%2d\n",x);
x
= -4/-5; printf("%2d\n",x);
x = -5/-6; printf("%2d\n",x);
}
运
行结果:
0
0
0
0
0
这两个例子我想大家都觉得很简单,但简单并不代表它没价值,
特别是它
和其它事物联系其来时你才会注意到。
“/”在我们这些程序中代表整除,它符合除法法则,异号抵消。
再看看我们余数的定义
:
整除“余”下的“数”。
则有:余数=被除数-商*除数
商就是我
们整除的结果。
看例子:
eg1:
(-6%5) = -6 - (-6/5)*5
(-6%5) = -6 - (-1)*5
(-6%5) = -6 - (-5)
(-6%5) =
-6+5
(-6%5) = -1
eg2:
(5%-6) = 5 -
(5/-6)*(-6)
(5%-6) = 5 - (0)*(-6)
(5%-6) = 5 -
0
(5%-6) = 5
eg3:
(-5%-6)= -5 - (-5/-6)*(-6)
(-5%-6)= -5 - (0)*(-6)
(-5%-6)= -5 - 0
(-5%-6)=
-5
eg4:
(6%-5) = 6 - (6/-5)*(-5)
(6%-5) = 6
- (-1)*(-5)
(6%-5) = 6 - 5
(6%-5) = 1
到现在为
止,你还有什么疑惑?
但我还是有点不明白,这是数学中的定义吗?
我查了一下《Concrete Mathematics》,请看原文:
摘
之 P82
------------------
3.4 ‘MOD': THE
BINARY OPERATION
The quotient of n divided by m is [n/m],when m
and n are positive
integers. It's handy to have a simple notation
also for the remainder
of this division, and we call it 'n mod m',
The basic formula
n = m[n/m]+ n mod m
//NOTE:"m[n/m]" is
quotient, "n mod m" is remainder
tells us that we can express n mod m
as n-m[n/m] .We can generalize this
to megative integers, and in
fact to arbitrary real numbers:
x mod y = x - y[x/y], for y!=0.
--------------------
从
文中可能看出,数学中的 余数(remainder) 其实就是 取模(mod),即:
x mod y = x%y
x%y = x - y[x/y], for y!=0.
数学中的余数概念和我们的计算机中的余数概念一致,但实现却不一致。
其
中 [x/y] 代表的是 x/y 的最小下界。
例:
-3 mod 2 = -3 - 2*[-3/2]
= -3 - 2*[-1.5]
= -3 - 2*(-2)
= -3 + 4
= 1
而我们的计算机是怎么做的呢:
-3%2 = -3 - 2*(-3/2)
= -3 -
2*(-1)
= -3 - (-2)
= -1
所以计算机中的取余实际上是:
x%y = x - y(x/y), for y!=0.
这就是二者的区别。这个区别,对于正数,二者计算出的结果是相等的,但是负数就不相等了。这就意味着,如果以后在使用数学中余数相关定理的时候,要注意计
算机中余数的计算和数学定义不是完全一致的,所以在计算机上,对于负数,数学定理并不完全适用。当然,对于正数,二者是没有区别的。至于为什么计算机上要
这么实现,我想恐怕还是历史原因,最早的计算机如果这样计算除法(取余是靠除法来完成的),那么就涉及到浮点数的计算以及取下界,这样,将比较大的降低效
率,所以实现成了这样的方式,一直沿用至今。
相关推荐
在二维数组或图像处理中,横向取模通常是指对每一行进行取模运算,而纵向取模则是指对每一列进行取模。例如,假设我们有一个32x32的矩阵,如果我们对每一行进行模32的操作,那么就会得到32个结果,每个结果代表一行...
本文实例汇总了C语言实现的快速幂取模算法,是比较常见的算法。分享给大家供大家参考之用。具体如下: 首先,所谓的快速幂,实际上是快速幂取模的缩写,简单的说,就是快速的求一个幂式的模(余)。在程序设计过程中,...
在编程领域,特别是在C语言中,取模运算(也称为模运算或余数运算)是进行数学计算的重要操作。这个“c代码-取模运算测试”项目可能涉及到编写C程序来演示和测试取模运算的功能。取模运算符在C语言中用百分号(%)...
在数值运算中,算术运算符是最常见的,例如加减乘除和取模。关系和逻辑运算符则用于条件判断和流程控制。 3. 浮点数处理:C语言中的浮点数运算可能会有精度损失,这是由于计算机内部二进制表示的局限性。在进行...
根据提供的文件信息,我们可以归纳出两个主要的知识点:ASCII码和C语言中的位运算优先级。下面将分别对这两个主题进行详细的阐述。 ### ASCII码 ASCII(American Standard Code for Information Interchange,美国...
TOMMATH提供了完整的API,支持大数的加减乘除、比较、取模、平方根等操作,以及一些高级函数,如素数测试和模逆运算。使用这样的库可以简化开发者在C语言环境中实现大数运算的复杂性。 “ltm-0.39.zip”是...
C语言 小小计算器 期末作业 源码集合,为广大学子提供真实可用的源码参考 这份源码的要求已经分布在我的动态中,请在我的“主页”中搜索 ——【C语言】 “小小计算器”基本功能实现 或 复制以下链接:...
算术运算主要包括加法 (+)、减法 (-)、乘法 (*)、除法 (/) 和取模运算 (%),它们是编程中最基础的运算。例如,x = y + 2 将y的值加上2后赋给x。C语言还支持自增运算符 (++x 和 x++) 以及自减运算符 (--x 和 x--),...
需要注意的是,整数除法会去掉小数部分,而取模运算返回除法的余数。 二、赋值运算符 赋值运算符用于将右边的值赋予左边的变量。最基础的赋值运算符是`=`, 如`a = 5;`将5赋值给变量a。还有复合赋值运算符,如`+=`, ...
算术运算包括加法(+), 减法(-), 乘法(*), 除法(/)和取模(%)。这些运算符用于对整型和浮点型数据执行基本的数学运算。例如,`x = y + 2`表示将y的值加2并赋给x。需要注意的是,除法运算对于整数可能会导致结果被截断...
- **取模运算**:`%` 运算符用于取模运算,示例代码未直接使用取模运算,但在判断 `if (B % A == 0)` 中间接体现了其用法,用于判断 B 是否能被 A 整除。 #### 循环结构的应用 - **while循环**:示例代码中使用 `...
C语言运算符优先级表 C语言运算符优先级表是指在C语言中所有运算符... * 说明:对表达式进行顺序运算操作 * 结合方向:左到右 正确理解和掌握C语言运算符的优先级和结合方向对于编写正确和高效的C语言程序非常重要。
【知识点一:C语言的取模运算】 在C语言中,取模运算符 `%` 用于求两个数相除后的余数。在给定的代码段中,`t=*n % __1__` 这一行是用来获取变量*n的个位数字。由于我们需要找到的是个位上的数字,而十进制数的每一...
算术表达式是C语言中操作数值的基本表达式,包括加法(+), 减法(-), 乘法(*), 除法(/)和取模运算(%). 除法运算需要注意的是,如果两个操作数都是整数,则结果也是整数,取模运算要求两个操作数都是整数。赋值表达式则...
2. **加密过程**:给定明文M(一个整数),计算C=M^e mod n,其中^表示幂运算,mod表示取模运算,C即为密文。 3. **解密过程**:接收方收到密文C后,通过C^d mod n得到M',由于d是e的逆元,因此M'=M。 在实现中,...
9. 类型转换和取模运算:在C语言中,混合类型的运算会涉及隐式类型转换,表达式`(float)(a+b)/2+(int)x%(int)y`会先进行浮点除法和整数取模运算,然后进行类型转换。 10. 浮点变量的输出:`printf`函数用于输出,...
算术运算符用于执行基本的数学运算,如加法、减法、乘法、除法和取模运算。 - **加法运算符(+)**:用于进行数值相加或表示正数。例如:`3 + 5`、`+3`。 - **减法运算符(-)**:用于进行数值相减或表示负数。例如...