模运算

取模和取余的区别

左心房为你撑大大i 提交于 2020-04-06 07:19:07
对于整型数a,b来说,取模运算或者求余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余数: r = a - c*b. 求模运算和求余运算在第一步不同: 取余运算在取c的值时,向0 方向舍入(fix()函数);而取模运算在计算c的值时,向无穷小方向舍入(floor()函数)。 例如:计算-7 Mod 4 那么:a = -7;b = 4; 第一步:求整数商c,如进行求模运算c = -2(向无穷小方向舍入),求余c = -1(向0方向舍入); 第二部:计算模和余数的公式相同,但因c的值不同,求模时r = 1,求余时r = -3。 归纳:当a和b符号一致时,求模运算和求余运算所得的c的值一致,因此结果一致。 当符号不一致时,结果不一样。求模运算结果的符号和b一致,求余运算结果的符号和a一致。 另外各个环境下%运算符的含义不同,比如c/c++ 为取余,而java则为取模。 在C语言中,%符号表示的是求余运算,在python脚本中,%表示的是取模。(通常取模运算中b不允许是负数,但是在python 2.5.1里可以在%后面跟负数,因为python语言中除法的结果是向0舍入,因此计算结果是取模!) 下面表格是一些典型的取模或者求余的值。 a b C语言:a%b (求余) Python Shell: a%b(取模) -3 -5 -3 -3 -3 4 -3 1 -3 2 -1

取余和取模运算

折月煮酒 提交于 2020-04-06 07:06:09
https://blog.csdn.net/origin_lee/article/details/40541053 通常情况下取模运算(mod)和求余(rem)运算被混为一谈,因为在大多数的编程语言里,都用'%'符号表示取模或者求余运算。在这里要提醒大家要十分注意当前环境下'%'运算符的具体意义,因为在有负数存在的情况下,两者的结果是不一样的。 对于整型数a,b来说,取模运算或者求余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余数: r = a - c*b. 求模运算和求余运算在第一步不同: 取模 求余运算在取c的值时,向0 方向舍入(fix()函数); 而 求余 取模运算在计算c的值时,向无穷小方向舍入(floor()函数)。 因此,当a和b符号一致时,求模运算和求余运算所得的c的值一致,因此结果一致。但是当符号不一致的时候,结果不一样。 具体来说,求模运算结果的符号和b一致,求余运算结果的符号和a一致。 在C语言中,%符号表示的是求余运算,在python脚本中,%表示的是取模。(通常取模运算中b不允许是负数,但是在python 2.5.1里可以在%后面跟负数,因为python语言中除法的结果是向0舍入,因此计算结果是取模!) 下面表格是一些典型的取模或者求余的值。 a b C语言:a%b (求余) Python Shell: a%b(取模) -3 -5

取模和求余的区别

ぃ、小莉子 提交于 2020-04-06 06:32:28
通常情况下取模运算(mod)和求余(rem)运算被混为一谈,因为在大多数的编程语言里,都用'%'符号表示取模或者求余运算。在这里要提醒大家要十分注意当前环境下'%'运算符的具体意义,因为在有负数存在的情况下,两者的结果是不一样的。 对于整型数a,b来说,取模运算或者求余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余数: r = a - c*b. 求模运算和求余运算在第一步不同: 取模求余运算在取c的值时,向0 方向舍入(fix()函数); 而求余取模运算在计算c的值时,向无穷小方向舍入(floor()函数)。 因此,当a和b符号一致时,求模运算和求余运算所得的c的值一致,因此结果一致。但是当符号不一致的时候,结果不一样。 具体来说,求模运算结果的符号和b一致,求余运算结果的符号和a一致。 在C语言中,%符号表示的是求余运算,在Python脚本中,%表示的是取模。(通常取模运算中b不允许是负数,但是在python 2.5.1里可以在%后面跟负数,因为python语言中除法的结果是向0舍入,因此计算结果是取模!) 来源: https://www.cnblogs.com/aliwa/p/6390296.html

C++堆栈应用(一):数制转换

让人想犯罪 __ 提交于 2020-02-06 07:01:50
十进制N和其它进制数的转换是计算机实现计算的基本问题,其解决方法很多,其中一个简单算法基于下列原理: N=(n div d)*d+n mod d ( 其中:div为整除运算,mod为求余运算) 例如 (1348)10=(2504)8,其运算过程如下: 不难发现,最后得到的余数2在新的八进制数的最高位(第一位),而最先得到的余数4在新的八进制数的最低位(最后一位)。而我们一般读数是从最高位读起,所以比较简便的做法是将每次取余(mod)得到的余数存储在具有后进先出的特点的结构中,这样只需依次读出余数,便得到了相应的新数制的数。而堆栈刚好具有这样的特点。 使用堆栈进行数制转换的算法如下: void Conversion ( int n , int base ) { LinkStack * s ; s = InitStack ( ) ; int remainder ; while ( n != 0 ) { //进行求模运算,直到n为0时退出循环 remainder = n % base ; Push ( s , remainder ) ; n = n / base ; } while ( s - > next != NULL ) //依次弹出栈顶的元素,最终形成的数即为所求进制数 cout << Pop ( s ) ; cout << endl ; } 1.使用链栈实现数制转换的完整程序

程序中的 “负数取模” 问题

安稳与你 提交于 2020-01-13 04:37:14
整数除法取整 计算机上有几种对于结果取整的方法: 向上取整,向+∞方向取最接近精确值的整数,也就是取比实际结果稍大的最小整数,也叫 Ceiling 取整。这种取整方式下,17 / 10 == 2,5 / 2 == 3, -9 / 4 == -2。 向下取整,向-∞方向取最接近精确值的整数,也就是取比实际结果稍小的最大整数,也叫 Floor 取整。这种取整方式下,17 / 10 == 1,5 / 2 == 2, -9 / 4 == -3。 向零取整,向0方向取最接近精确值的整数,换言之就是舍去小数部分,因此又称截断取整(Truncate)。这种取整方式下,17 / 10 == 1,5 / 2 == 2, -9 / 4 == -2。 取模怎么算 取模运算实际上是计算两数相除以后的余数。假设 q 是 a、b 相除产生的商(quotient),r 是相应的余数(remainder),那么在几乎所有的计算系统中,都满足: a = b x q + r,其中 |r|<|a|。 因此 r 有两个选择,一个为正,一个为负;相应的,q 也有两个选择。如果a、b 都是正数的话,那么一般的编程语言中,r 为正数;或者如果 a、b 都是负数的话,一般 r 为负数。但是如果 a、b 一正一负的话,不同的语言则会根据除法的不同结果而使得 r 的结果也不同,但是一般 r 的计算方法都会满足: r = a - (a

负数取模

家住魔仙堡 提交于 2020-01-11 23:30:18
本文转载于: http://blog.sina.com.cn/s/blog_6f5c63ff0100tucb.html 我们知道,在不同的语言中,对负数执行取模运算,结果有可能会是不同的。例如,(-11)%5在python中计算的结果是4,而在C(C99)中计算的结果则是-1。 truncate除法 && floor除法 在大多数编程语言中,如果整数a不是整数b的整数倍数的话,那么a、b做除法产生的实际结果的小数部分将会被截除,这个过程称为截尾(truncation)。如果除法的结果是正数的话,那么一般的编程语言都会把结果趋零截尾,也就是说,直接把商的小数部分去除。但是如果除法的结果是负数的话,不同的语言通常采用了两种不同的截尾方法:一种是趋零截尾(truncate toward zero),另一种是趋负无穷截尾(truncate toward negative infinity);相应的,两种除法分别被称为truncate除法和floor除法。事实上,可以认为不管除法的结果是正是负,truncate除法都是趋零结尾;而floor除法都是趋负无穷结尾。 取模运算 取模运算实际上是计算两数相除以后的余数。假设q是a、b相除产生的商(quotient),r是相应的余数(remainder),那么在几乎所有的计算系统中,都满足a=b*q+r,其中|r|<|a|。因此r有两个选择,一个为正

快速看懂HashMap

余生颓废 提交于 2019-12-03 19:49:14
在开始之前,先过一遍本博客的重点 • HashMap寻值的速度快是因为HashMap的键会被映射成Hash值,从而避开用equal方法遍历来加快寻值速度。 • HashMap有初始容量和加载因子两个参数来控制性能。当条目大于容量*加载因子时,容量翻一倍。 • HashMap和Hashtable的区别在于线程安全性,同步,以及速度。 下面开始正文 1.HashMap的具体实现 Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类继承关系如下图所示: HashMap中我们最常用的就是put(K, V)和get(K)。我们都知道,HashMap的K值是唯一的,所以查询和修改数据的时候只要用equal遍历所有的key值就可以了,但我们知道直接遍历查询的时间复杂度为O(n),在数据量比较大时效率不高,所以在java中运用Hash算法来对所有的key进行运算加入数组中。查询的时候直接用数组下标来访问数据(时间复杂度变成了O(1)),以此绕开了用equal遍历带来的效率损失。 HashMap根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。 HashMap最多只允许一条记录的键为null

简述 取模运算Modulo Operation 及其与 取余运算Complementation 区别联系

匿名 (未验证) 提交于 2019-12-03 00:43:02
综述: 取模运算(“Modulo Operation”)和取余运算(“Complementation ”)两个概念有重叠的部分但又不完全一致。主要的区别在于 对负整数进行除法运算时操作不同。 取模主要是用于计算机术语中。取余则更多是数学概念。 取模运算 定义: 给定一个正整数p,任意一个整数n,一定存在等式 : 其中 k、r 是整数,且 0 ≤ r < p,则称 k 为 n 除以 p 的商,r 为 n 除以 p 的余数。 乍一看和求在定义上算没什么太大的区别,但是实际大有不同。 与取余运算区别 对于整型数a,b来说,取模运算或者求余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余数: r = a - c*b. 但他们在计算时候两者的不同点只有一个 取余运算在计算商值向0方向舍弃小数位 取模运算在计算商值向负无穷方向舍弃小数位 同时,也可以这样理解: 取余,遵循尽可能让商的绝对值小的原则 取模,遵循尽可能让商小的原则 即取余(rem)和取模(mod)在被除数、除数同号时,结果是等同的,但是 当a,b异号时会有区别,所以要特别注意异号的情况 。 例如: 就 a = 7, b = 4 情况而言 c = 7 / 4; 求整数商c,如进行求模运算c = -2(向负无穷方向舍入),求余c = -1(向0方向舍入); 同理 7mod 4 = 1(商 = -1 或 -2,-2

浅谈密码学中数论基础

匆匆过客 提交于 2019-12-02 01:12:23
浅谈密码学中数论基础 1.模运算1765243235 模运算也可以称为取余运算,例如 23≡11(mod12),因此如果a=kn+b,也可以表示为a ≡ b(mod n),运算规则: (a+b) mod n = ((a mod n) + (b mod n))mod n (a*b) mod n = ((a mod n) * (b mod n)) mod n 完全剩余集合 1~n-1构成了自然数n的完全剩余集合,对于任意一个整数m%n都存在于1~n的集合中。 构造加法链 在加密算法中,运用到了大量的取模运算,对于一个k位数模n,所有的运算例如加减乘除中间结构将不会超过2k位,因此例如a x mod n将会大大简化计算时的复杂度。 例如a 8 mod n 在计算时可以这样计算 ((a 2 mod n) 2 mod n) 2 mod n 当指数x不是2的倍数时则需要构造加法链,例如25,25 = 16 + 8 +1 = 2 4 + 2 3 + 2 0 因此a 25 mod n = (a * a 8 * a 16 ) mod n = ((((a 2 * a) 2 ) 2 ) 2 *a)mod n C语言表示 unsigned long ss(unsigned long x , unsigned long y , unsigned long n) { unsigned long s,t,u;

为什么int整型(32位)的范围是-32768到32767?

流过昼夜 提交于 2019-11-30 19:43:23
计算机为什么要用反码存储整型 这得从二进制的原码说起: 如果以最高位为符号位,二进制原码最大为0111111111111111=2的15次方减1=32767 最小为1111111111111111=-2的15次方减1=-32767 此时0有两种表示方法,即正0和负0:0000000000000000=1000000000000000=0 所以,二进制原码表示时,范围是-32767~-0和0~32767,因为有两个零的存在,所以不同的数值个数一共只有2的16次方减1个,比16位二进制能够提供的2的16次方个编码少1个。 但是计算机中采用二进制补码存储数据,即正数编码不变,从0000000000000000到0111111111111111依旧表示0到32767,而负数需要把除符号位以后的部分取反加1,即-32767的补码为1000000000000001。 到此,再来看原码的正0和负0:0000000000000000和1000000000000000,补码表示中,前者的补码还是0000000000000000,后者经过非符号位取反加1后,同样变成了0000000000000000,也就是正0和负0在补码系统中的编码是一样的。但是,我们知道,16位二进制数可以表示2的16次方个编码,而在补码中零的编码只有一个,也就是补码中会比原码多一个编码出来