> 文档中心 > 宝藏级别的负数取模,让你关于负数取模不在陌生 >o< 进来看看吧

宝藏级别的负数取模,让你关于负数取模不在陌生 >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.总结

  1. 浮点数取整有很多方式。
  2. 对于a b两个自然数,d非0,可以证明两个唯一的整数 q 和 r ,满足 a = q*d + r 并且 0<= |r| < |d|其中q被称为商,r 被称为余数。
  3. 不同语言中,余数的不同,可以分别叫为正余数和负余数。
  4. 具体余数的大小,是由于商的大小确定的,本质是商的取整方式不同导致的余数不同。
  5. 取余和取模的本质不同,取模:是尽可能让商向负无穷大取整。
    取余:是尽可能让商向0进行取整。
  6. .除数和被除数同符号的来说,取模等价于取余。
  7. 在C语言中不同符号取余(或者其他采用0向取整的语言来说),余数符号与被除数相同。

下期预告

下期讲位运算符,下期更精彩哦~~~
各位看官,给个三连吧 !!!
在这里插入图片描述