除数或被除数为负数时求余数问题

问题描述

首先可以看到不同编程语言下,求余数结果是不同的。我试了一些,具体如下。

算式/结果 C++ Java JavaScript Python
5 % -2 1 1 1 -1
-5 % 2 -1 -1 -1 1
-5 % -2 -1 -1 -1 -1
5 % -3 2 2 2 -1
-5 % 3 -2 -2 -2 1
-5 % -3 -2 -2 -2 -2
5 % -4 1 1 1 -3
-5 % 4 -1 -1 -1 3
-5 % -4 -1 -1 -1 -1

为什么会有这样的结果?

解释

因为 不同编程语言对 % 运算符的定义不同

  • C/C++,Java,JavaScript 为 取余
  • Python 为 取模

取模运算(“Modulo Operation”)和取余运算(“Complementation ”)是有重叠部分但又不完全一致的两个概念。当除数和被除数均大于0时,求模运算和求余运算一致。而对于对 负整数 进行除法运算时操作却不同。取模主要是用于计算机术语中,取余则更多是数学概念。

假设有式子(a除以b等于c余数r):
a ÷ b = c ⋅ ⋅ ⋅ r a ÷ b = c ··· r a÷b=cr

  1. ab 均大于 0 时,求模运算和求余运算所得的 c 的值一致,r >= 0, 当 ab 有负数时,见下。

  2. 求余 运算时,当 r 不为 0, r 的符号和 a 一致。即 余数符号和被除数符号必须相同

  3. 求模 运算时,取除法的整数商默认优先取地板商,即往负无穷方向取最邻近整数。模运算具体实现过程为:

    举例 说明
    5 mod -2 = 1 商 = -2 或 -3,-3<-2,取商=-3,余 = -1
    -5 mod 2 = 1 商 = -2 或 -3,-3<-2,取商=-3,余 = 1
    -5 mod -2 = 1 商 = 2 或 3,2<3,取商=2,余 = -1

附加代码

估计同学们也用不到这些,就算是做个记录吧。

Java

[root@VM-0-9-centos YushuTest]# cat JavaTest.java
public class JavaTest
{
  public static void main(String[] args)
  {
    System.out.println("5 % -2 = " + (5%(-2)));
    System.out.println("-5 % 2 = " + ((-5)%2));
    System.out.println("-5 % -2 = " + ((-5)%(-2)));
    System.out.println("5 % -3 = " + (5%(-3)));
    System.out.println("-5 % 3 = " + ((-5)%3));
    System.out.println("-5 % -3 = " + ((-5)%(-3)));
    System.out.println("5 % -4 = " + (5%(-4)));
    System.out.println("-5 % 4 = " + ((-5)%4));
    System.out.println("-5 % -4 = " + ((-5)%(-4)));}
}
[root@VM-0-9-centos YushuTest]# javac JavaTest.java
[root@VM-0-9-centos YushuTest]# java JavaTest
5 % -2 = 1
-5 % 2 = -1
-5 % -2 = -1
5 % -3 = 2
-5 % 3 = -2
-5 % -3 = -2
5 % -4 = 1
-5 % 4 = -1
-5 % -4 = -1

C++

[root@VM-0-9-centos YushuTest]# cat CppTest.cpp
#include
using namespace std;
int main()
{
  cout<<"5 % -2 = "<<(5%(-2))<>> 5 % (-2)
-1
>>> (-5) % 2
1
>>> (-5) % (-2)
-1
>>> 5 % (-3)
-1
>>> (-5) % 3
1
>>> (-5) % (-3)
-2
>>> 5 % (-4)
-3
>>> (-5) % 4
3
>>> (-5) % (-4)
-1

JavaScript

Javascript就直接在浏览器控制台里算的,结果如下

> 5 % (-2)
> 1
> (-5) % 2
> -1
> (-5) % (-2)
> -1
> 5 % (-3)
> 2
> (-5) % 3
> -2
> (-5) % (-3)
> -2
> 5 % (-4)
> 1
> (-5) % 4
> -1
> (-5) % (-4)
> -1

.
.
.
.
.
.


桃花仙人种桃树,又摘桃花换酒钱_

你可能感兴趣的:(Memos,求余,求模,编程语言)