迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C++ >

C++ 中负数的模数

作者:迹忆客 最近更新:2023/08/31 浏览次数:

在本文中,我们将发现余数和模数之间的差异。 我们将了解 % 运算符的基础知识。

稍后,我们将了解 % 运算符在 Python 和 C++ 中的行为方式。 最后,我们将通过讨论在 C++ 中实现模数功能的几种方法来总结本文。


余数与模数

% 符号的确切行为可能因不同的编程语言而异。 操作员经常产生令人惊讶的结果,让我们感到困惑。

它会产生模数还是余数吗? 在检查其在编程语言中的行为之前,让我们首先澄清它们有何不同。

余数

余数只是两个整数算术除后剩下的部分。 无论是正数还是负数,余数的符号始终由被除数的符号决定。

检查下面的示例可以清楚地理解这一点。

例子:

  1. 7%3=1

    这里的被除数是 7,它是正号,所以结果也将是正号。

  2. -7%3=-1

    这里被除数是-7,是负号,所以结果也将是负号。

  3. 7%-3=1

    这里的被除数是 7,它是正号,所以结果也将是正号。

  4. -7%-3=-1

    这里被除数是-7,是负号,所以结果也将是负号。

模数

当余数与除数符号相反时,模为余数与除数之和;当余数与除数同号时,模为算术除后的剩余部分。

模数将与除数具有相同的符号。 检查下面的示例可以清楚地理解这一点。

例子:

  1. 5%3=2

    这里除数和余数都是正号,因此余数也将是正号。

  2. -5%3=1

    这里,除数和余数的符号相反,因此结果将是余数和除数的和。 即-2 + 3 = 1

  3. 5%-3=-1

    这里除数和余数都是相反的符号。 结果将是余数与除数之和。 即 2 + -3 = -1

  4. -5%-3=-2

    这里除数和余数的符号相同,因此结果与余数相同。

从上面的例子可以清楚地看出,如果被除数和除数都为正,则模和余数相同。 两者在负数的情况下是不同的。

至此,我们希望清楚余数和模数有何不同。 现在我们来谈谈 % 运算符在 Python 和 C++ 中的行为。


C++ 中的 % 运算符

在 C++ 中,% 称为模运算符。 它是一个算术运算符。

它用于计算执行整数除法所产生的余数。 尽管它的名称为“模”,但要记住的重要一点是它不提供模数。

在 C++ 中,% 符号仅返回余数。 检查下面的示例。

#include <iostream>
using namespace std;
int main()
{
    cout << -7 % 3 << endl;
    cout <<  7 % -3 << endl;
}

输出:

-1
 1

正如输出所示,% 运算符没有给出模数。 它只是返回余数。


C++中%的实现

让我们看看%在C++中的实现。 C++ 中的余数根据以下等式返回。

让我们开发使用上面的等式(不使用 % 运算符)计算余数的逻辑。

#include <iostream>
using namespace std;

int calRemainder(int a, int b)
{
    int q = a / b;
    return a - (b * q);
}
int main()
{
    int a = -7, b = 3;
    cout << calRemainder(a, b) << endl;
}

输出:

-1

Python 中的 % 运算符

在 Python 中,% 被称为模运算符。 模运算符在 Python 中被视为算术运算。

它用于计算执行整数除法所产生的模数。 这就是Python与C++的不同之处。

当我们在 C++ 中使用模运算符时,它返回余数,而 Python 返回模数。 检查下面的示例以观察 Python 中模运算符的行为。

print (-7 % 3)
print (7 % -3)

输出:

 2
-2

在第一个示例中,-7 % 3 给出余数 -1。 由于余数 (-1) 和除数 (3) 符号相反,因此它们的和将为我们提供模数。 即-1 + 3 = 2。

例2也是如此。


Python中%的实现

我们来看看%在Python中的实现。 Python 中的模数根据以下等式返回。

让我们使用上面的等式(不使用 % 运算符)来开发计算模数的逻辑。

from math import floor

def calModulus(a, b):
    q = floor(a / b)
    return a - b * q

print (calModulus(-7, 3))

输出:

2

在 C++ 中实现 Python 等效模数的方法

我们研究了余数和模数的区别以及 % 运算符在 Python 和 C++ 中的行为方式。 在 Python 中,当您将 % 与正除数一起使用时,您总是会得到非负值。

大多数时候,我们使用正除数,并且我们需要模数的功能而不仅仅是余数。 如果除数为正号,则模数始终返回正值。

让我们看看在 C++ 中实现此行为的不同技术。

方法 1:实现方程

我们可以通过在 C++ 中实现等式 modulus = a - ( b * Floor( a / b ) ) 来实现 Python 模数行为。

#include <iostream>
#include <math.h>
using namespace std;

int getModulus(int dividend, int divisor)
{
    // Type casting is necessary as (int)/(int) will give int result, i.e. -5 / 2 will give -1 and not -2.5
    int t = (int)floor((double)dividend / divisor);
    return dividend - divisor * t;
}

int main()
{
    cout << getModulus(-8, 3);
}

输出:

1

方法二:余数与除数相加

在 C++ 中实现模数功能的另一种方法是,如果余数和除数的符号相反,则将它们相加。

我们假设除数是正号,因此每当我们得到负余数时,我们将其添加到除数以获得模值。

#include <iostream>
using namespace std;

int getModulus(int dividend, int divisor)
{
    int t = dividend % divisor;
    return t >= 0 ? t : t + divisor;
}

int main()
{
  cout << getModulus(-7,3);
}

输出:

2

上一篇:C++ 中最快的排序算法

下一篇:没有了

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

C++ 中最快的排序算法

发布时间:2023/08/31 浏览次数:150 分类:C++

本文将解释哪种排序算法在什么条件下表现最好。 条件包括数据结构的类型、排序数据的大小、数据排列和数据元素的范围。

将 DLL 反编译为 C++ 源代码

发布时间:2023/08/31 浏览次数:197 分类:C++

本文讨论我们可以用来将 DLL 反编译为 C++ 源代码的工具。反编译器简介 反编译器是一种逆向工程工具。

处理 C++ 中的访问冲突

发布时间:2023/08/31 浏览次数:86 分类:C++

访问冲突,也称为分段错误,意味着您的 C++ 程序试图访问未在作用域中保留的内存。 本文将教您如何解决 C++ 中的访问冲突错误。

在 C++ 中实现静态多态性

发布时间:2023/08/31 浏览次数:189 分类:C++

静态多态性主要可以在 C++ 上下文中解释。 本教程将教您重要性、有用性以及如何在 C++ 中实现静态多态性。C++ 中的 std:sort 函数是静态多态的,因为它依赖于对象提供的接口(行为类似于迭代

增强 C++ 中 windows.h 的有效性

发布时间:2023/08/31 浏览次数:165 分类:C++

人们普遍认为 #include 与 #include 头文件一样不好。 在本文中,您将了解 Windows.h 有用性背后的真相,以及它在 C++ 中是好是坏。

C++ 中的竞争条件

发布时间:2023/08/31 浏览次数:173 分类:C++

在本文中,我们将了解竞争条件的概念。 首先,我们将介绍线程,然后我们将通过示例讨论线程中的竞争条件。最后,我们将看到避免/控制竞争条件的解决方案。

在 C++ 中使用 TextOut() 更新文本

发布时间:2023/08/31 浏览次数:109 分类:C++

C++ 中的 TextOut() 函数使用选定的字体、背景颜色和文本颜色在指定位置写入字符串。 它属于`#include wingdi.h`。在本文中,您将学习如何使用 C++ 中的 TextOut() 函数更新任何文本。

用 C++ 测试射线三角形相交

发布时间:2023/08/28 浏览次数:76 分类:C++

测试光线-三角形相交可能需要数百万次测试,并且被认为是 C++ 中任何光线追踪器的核心操作之一(需要为每种几何基元类型提供不同的函数实现)。 本教程将教您如何用 C++ 编写射线-三角形

在 C++ 中取消引用迭代器

发布时间:2023/08/28 浏览次数:64 分类:C++

迭代器是 C++ 中的另一种强大机制,可帮助您迭代复杂的数据结构(例如树)和内部没有元素索引的集合(例如数组)。C++ 中的迭代器是什么 在 C++ 中,迭代器是一个类似于指针的对象,指向数

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便