负数取余问题

前言:
对于两个相同符号的数取余大家都很熟悉,但是对于一正一负的数取余呢?大家可能觉得会很陌生,今天在刷leetcode7:整数反转(easy)这道题的时候,想起了这个知识点,遂打算探讨一番。

自然数取余定义分为两种:

  • 1)定义1:如果a和d是两个自然数,d非零,可以证明存在两个唯一的整数 q 和 r,满足a=qd+r且0 ≤ r < d(其中q为商,r为余数)。
    定义1一般作为数学中的取余法则,即两个数取余,余数总是为正数。
  • 举例:
    5%3=3x1+2,商为1,余数为2
    (-5)%(-3)=(-3)x2+1,商为2,余数为1
    5%(-3)=(-3)x(-1)+2,商为-1,余数为2
    (-5)%3=3x(-2)+1,商为-2,余数为1

  • 2)定义2:如果a 与d 是整数,d 非零,那么余数 r 满足这样的关系:a = qd + r , q 为整数,且0 ≤ |r| < |d|。定义2取余的结果就会导致出现两个余数了,比如5%(-3) = (-3)x(-1)+2 = (-3)x(-2)-1,所以这里的余数2和-1都满足定义。
    我们把2称为正余数,-1成为负余数。通常,当除以d 时,如果正余数为r1,负余数为r2,那么有r1 = r2 + d。
  • 所有语言和计算器都遵循了尽量让商尽量靠近0的原则,即5%(-3) 的结果为2而不是-1,(-5)%3的结果是-2而不是1。

测试代码如下:

#include <iostream>
using namespace std;

int main()
{
    cout<<(5%3)<<endl;		//5=3x1+2
    cout<<(-5%-3)<<endl;	//-5=-3x1-2
    cout<<(5%-3)<<endl;		//5=-3x(-1)+2
    cout<<(-5%3)<<endl;		//-5=3x(-1)-2
    system("pause");
    return 0;
}

通俗地解释编译器的运行结果:
(-5%-3)编译器先将-3自动转换为正整数3,然后计算-(5%3)的结果,所以运算结果为-2。
(5%-3)编译器先将-3自动转换为正整数3,然后计算(5%3)的结果,所以运算结果为2。
(-5%3)编译器直接计算-(5%3)的结果,所以运算结果为-2。

测试结果如下:
在这里插入图片描述


总结:

  • 1)不管是两个同号数取余还是两个异号数取余,取余结果是正整数才是我们生活中普遍认可的结果。

  • 2)在编译器中,两个异号的数取余之后的结果取决于分子的符号。负数%负数,编译器会将分母的负数自动转换为正整数,然后再将分子负数的负号提取出来,将两个正整数取余,最后的结果加上负号就好了。负数%正数,编译器先将分子负数的负号提取出来,将两个正整数取余,最后结果加上负号即可。正数%负数,编译器自动将分母负数转换为正整数,然后两个正整数取余得到就是最终结果。

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值