首页 > 其他分享 >分析负数取模与取余的规则

分析负数取模与取余的规则

时间:2024-09-14 20:02:30浏览次数:9  
标签:取模 定义 负数 取整 取余 余数

目录

负数"取模"


基本概念

如果a和d是两个自然数,d非零,可以证明存在两个唯一的整数 q 和 r,满足 a = q*d + r,且0 <= r < d。其中,q 被称为商,r 被称为余数。

//对应代码

int main()
{
int a = 10;
int d = 3;
printf("%d\n", a % d); //结果是1
//因为:a=10,d=3,q=3,r=1 0<=r<d(3)
//所以:a = q*d+r -> 10=3'3+1

return 0;

}

正数比较简单,我们不谈,只看负数,负数的情况还是比较复杂的,先来看看不同平台下负数"取模"的差异

int main()
{
    int a = -10; 
    int d = 3;
    printf("%d\n", a/d); 
    printf("%d\n", a%d);
}

image-20240504114217545

可以看出不同平台下C语言"取模"和取商是没有区别的.再看看python环境下的.

centos7默认python版本是2.7.5,故使用python 2.7.5版本测试. 也可以使用python3.7.3版本测试,结果是相同的

image-20240914175700078

可以发现两种语言负数求商和取余结果是不一样的.

定义中规定,余数是要大于等于0的,而C语言却计算出了负数.

结论:很显然,上面关于取模的定义,并不能满足语言上的取模运算.

因此引出了修正定义


修正定义

因为在C中,-10%3出现了负数,根据定义:满足 a = q*d + r 且0 <= r < d,C语言中的余数,是不满足定义的,因为,r<0了。
故,大家对取模有了一个修订版的定义:
如果a和d是两个自然数,d非零,可以证明存在两个唯一的整数 q 和 r,满足 a = q*d + r , q 为整数,且0 <= |r| < |d|。其中,q 被称为商,r 被称为余数。
有了这个新的定义,那么C中或者Python中的“取模”,就都能解释了。
解释C: -10 = (-3) ' 3 + (-1)
解释Python:-10 = (?)' 3 + 2,其中,可以推导出来,'?'必须是-4(至于为什么,后面验证),即-10 = (-4)' 3 + 2,才能 满足定义。
所以,在不同语言,同一个计算表达式,负数“取模”结果是不同的。我们可以称之为分别叫做正余数 和 负余数


是什么决定了这种现象?

具体余数r的大小,本质是取决于商的,商确定了,余数自然就能确定.

而商取决于什么? 答案是,取决于除法计算的时候,结果的取整规则.


取整规则决定商的值

C语言中取整规则默认是向0取整,python中默认取整规则是向下取整.

根据它们两个的规则,显然大于0的情况都是相同的,而小于0的情况是不同的,因此负数的情况下的它们的结果不相同

因为它们两的取整规则不同,而且又必须满足修订版的"取模"规则,决定了它们的计算结果现象

还有一个问题,那就是既然不同语言%符号计算的值不一样,那还是模数或余数吗?或者说取余和取模一样吗?


取模和取余不一样.


定义

取余:尽可能让商,进行向0取整. //即零向取整方式得到的是余数

取模:尽可能让商,向-∞方向取整. //即向下取整方式得到的是模数
//模数,在几何向量上看,模是长度,为正值.(不考虑复数).模是正是负具体还要结合相关领域的定义.在计算机科学中,模和余很多情况是不区分的.

根据定义:

C中%运算,本质是取余数.

python中%运算,本质是取模.

再根据取整规则来看:

image-20240504125433531

对任何一个大于0的数,对其进行0向取整和-∞取整,取整方向是一致的。故取模等价于取余
对任何一个小于0的数,对其进行0向取整和-∞取整,取整方向是相反的。故取模不等价于取余


小归纳:

同符号数据相除,得到的商,根据数学同符号相消规则,一定是正数,即大于0! 大于0取整方式就是相同的.
故,在对其商进行取整的时候,取模等价于取余。

标签:取模,定义,负数,取整,取余,余数
From: https://www.cnblogs.com/DSCL-ing/p/18414566

相关文章

  • CSP模拟 取模
    最近开始写CSP模拟的题,实际上考的题一点也不CSP题意有一个长度为\(n\)的序列\(A\),\(0\leqA_i<k\),你可以每次选取一个区间,将区间内所有元素\(+1\),然后将区间内所有元素对\(k\)取模。问最少几次操作可以把序列中所有元素都变为\(0\)。思路假设现在有一个数列\([2,3,......
  • Prometheus的拉取模式与zabbix推送模式有何区别?各有什么优缺点?
    Prometheus的拉取模式与Zabbix的推送模式在监控数据收集和处理方式上存在显著区别。以下是它们的主要区别及各自的优缺点:1.数据收集模式Prometheus拉取模式:Prometheus定期从被监控的目标(如Exporter、应用程序等)主动拉取数据。每个目标都需要暴露一个HTTP接口,Prome......
  • 南沙信奥赛C++陈老师解一本通题: 1326:【例7.5】 取余运算(mod)
    ​【题目描述】【输入】输入b,p,k的值。【输出】【输入样例】2109【输出样例】2^10mod9=7 #include<iostream>#include<stdlib.h>usingnamespacestd;longlongb,p,k,ans=1;intmain(){ cin>>b>>p>>k; for(inti=1;i<=p;i++) { ans*=b;......
  • Java的Math.abs()返回的一定都是非负数吗?
    结论  在使用 Math.abs() 时,除非处理 Integer.MIN_VALUE 或 Long.MIN_VALUE,返回的绝对值通常是非负的。Math.abs() 方法总结功能:Math.abs() 方法用于返回数字的绝对值。返回类型:适用于不同的数据类型,包括 int、long、float 和 double。返回值特性:正数和......
  • 模幂运算-要求算法返回幂运算a^b的计算结果与1337取模后的结果
    题目:模幂运算-要求算法返回幂运算a^b的计算结果与1337取模后的结果其中b是一个非常大的数,所以b使用数组形式表示。即无法直接a^b%1337计算此类问题的关键需要分治,拆分成更小规模的计算1)对于a^b,如果b=1234,则a^1234=a^4*(a^123)^10即a^b可以拆分后递归运算2)对于取模运算,(a*b......
  • 负数的右移与左移
    引用:负数的左移和右移-CSDN博客......
  • 基于PaddleNLP信息抽取,uie微调打造自己专属的信息抽取模型
    基于PaddleNLP信息抽取,uie微调打造自己专属的信息抽取模型UIE模型简介UIE优势应用示例UIE开箱即用UIE适用抽取示例命名实体识别(NamedEntityRecognition,简称NER)关系抽取(RelationExtraction,简称RE)事件抽取(EventExtraction,简称EE)评论观点抽取情感倾向分类......
  • 如何获取列中负数最多的组并添加另一个条件来过滤组?
    这是对此已接受的答案的扩展。我的数据帧:importpandasaspddf=pd.DataFrame({'a':[-3,-1,-2,-5,10,-3,-13,-3,-2,1,2,-100],'b':[1,2,3,4,5,10,80,90,100,99,1,12]})预期输出:ab5......
  • 返回列中负数最多的组的最佳方法是什么?
    我的数据帧是:importpandasaspddf=pd.DataFrame({'a':[-3,-1,-2,-5,10,-3,-13,-3,-2,1,2,-100],})预期输出:a0-31-12-23-5逻辑:我想返回最大的负数条纹。如果有多个连续最大,我想返回第一个连续。......
  • 顺序消费rocketMQ(FIFO先进先出)和小技巧 取模运算的周期性特征来将数据分组。
    20240801一、顺序消费MQ(FIFO先进先出)介绍二、一个小技巧,对于取模运算,用来在几以前进行随机选取,取模运算的周期性特征来将数据分组,使用场景对于取模会重复问题一、顺序消费MQ(FIFO先进先出)介绍发送顺序和消费顺序保持一致默认情况消费方式是并发模式,会导致消息乱序......