宝藏级别的负数取模,让你关于负数取模不在陌生 >o< 进来看看吧
今天重点说下 符号篇的取模和求商包括取余的一些问题。
希望大家今天也要心情愉快的学习哦。
1 关于取整的问题
首先要明白取模和取余,要先明白取整的问题。
2 .取整方向 和对对应的函数
常见的取整方向是有四种
第一种向0取整(C语言默认),函数为trunc
第二种负无穷大取整,函数为floor
第三种正无穷大取整,函数是ceil
第四种四舍五入取整,这个就很熟悉了,函数是round。
总的来说:关于浮点数的取整有很多不一样的方法,不同方法可能会有同一个结果,也可能不同结果
3. 关于取模和取余现象区别
关于概念,都在学习过程中学过了,在复习一遍吧,对于a b两个自然数,d非0,可以证明两个唯一的整数 q 和 r ,满足 a = q*d + r 并且 0<= r < d,其中q被称为商,r 被称为余数。(这样看的话,余数一定是正数)
看个例子
int a = -10;int b = 3;printf("%d\n", a / b);printf("%d\n", a%b);
为什么取模之后变为 -1 呢?
是定义错了?还是C语言错了?
这又是概念上的冲突了。
看下例2 :(因为没有其他环境,就用函数模拟实现Python环境下的结果)
int a = -10;int b = 3;printf("%.1f\n",floor(a*1.0/b));//用不同的取整方式printf("%.1f\n", a*1.0 - floor(a*1.0 / b)*3);//公式计算余数
这样来看的话,是不是和公式上的又好像一样呢?
4.取模和取余本质区别
因为语言不同导致对负数的 “取模” 的值不同,我们可以分别叫正余数,负余数。
所以对于C语言中概念更新 :
对于a b两个自然数,d非0,可以证明两个唯一的整数 q 和 r ,满足 a = q*d + r 并且 0<= |r| < |d|其中q被称为商,r 被称为余数。
从本质来看:是商的取整方向不同,导致结果不同。
取模:是尽可能让商向负无穷大取整。
取余:是尽可能让商向0进行取整。
C语言的 % 的本质是取余。
而模拟实现的Python的本质是取模。
5.同符号数取模
对于一个正数,它的取整方向,0向取整和负无穷大取整方向一样,所以取模取余是等价。
对于一个负数,它的取整方向,0向取整和负无穷大取整方向不一样,所以取模不等价取余。
得出一个结论 :除数和被除数同符号的来说,取模等价于取余。
6.不同符号取模
同符号的说过了,那么不同符号呢?下面通过数学的转化进行验证,在举例子。
对定义进行变化:
a = qd +r,变为 r = a - qd,形式上为 x = y +z;
那么最终的x的符号是由 |y| 和 |z|的谁的大决定的,那么r的符号就是哪个值的符号。
x是被除数,q*d实际上就是( 商 * 除数),除数是常量,那么最终的值其实是由商的取整方式决定的。
c是0向取整,所以商的绝对值是变小的,所以就是 q *d 是整体变小的。
结论就是 :
在C语言中不同符号取余(或者其他采用0向取整的语言来说),余数符号与被除数相同。
例
int a = 10;int b = -3;printf("%d\n", a%b);int c = -10;int d = 3;printf("%d\n", c%d);
根据结论,余数的符号和被除数相同,那么a%b为1,c%d为-1
打印结果,也就是1和-1.
7.总结
- 浮点数取整有很多方式。
- 对于a b两个自然数,d非0,可以证明两个唯一的整数 q 和 r ,满足 a = q*d + r 并且 0<= |r| < |d|其中q被称为商,r 被称为余数。
- 不同语言中,余数的不同,可以分别叫为正余数和负余数。
- 具体余数的大小,是由于商的大小确定的,本质是商的取整方式不同导致的余数不同。
- 取余和取模的本质不同,取模:是尽可能让商向负无穷大取整。
取余:是尽可能让商向0进行取整。 - .除数和被除数同符号的来说,取模等价于取余。
- 在C语言中不同符号取余(或者其他采用0向取整的语言来说),余数符号与被除数相同。
下期预告
下期讲位运算符,下期更精彩哦~~~
各位看官,给个三连吧 !!!