C++ 中负数的模数
在本文中,我们将发现余数和模数之间的差异。 我们将了解 % 运算符的基础知识。
稍后,我们将了解 % 运算符在 Python 和 C++ 中的行为方式。 最后,我们将通过讨论在 C++ 中实现模数功能的几种方法来总结本文。
余数与模数
% 符号的确切行为可能因不同的编程语言而异。 操作员经常产生令人惊讶的结果,让我们感到困惑。
它会产生模数还是余数吗? 在检查其在编程语言中的行为之前,让我们首先澄清它们有何不同。
余数
余数只是两个整数算术除后剩下的部分。 无论是正数还是负数,余数的符号始终由被除数的符号决定。
检查下面的示例可以清楚地理解这一点。
例子:
-
7%3=1
这里的被除数是 7,它是正号,所以结果也将是正号。
-
-7%3=-1
这里被除数是-7,是负号,所以结果也将是负号。
-
7%-3=1
这里的被除数是 7,它是正号,所以结果也将是正号。
-
-7%-3=-1
这里被除数是-7,是负号,所以结果也将是负号。
模数
当余数与除数符号相反时,模为余数与除数之和;当余数与除数同号时,模为算术除后的剩余部分。
模数将与除数具有相同的符号。 检查下面的示例可以清楚地理解这一点。
例子:
-
5%3=2
这里除数和余数都是正号,因此余数也将是正号。
-
-5%3=1
这里,除数和余数的符号相反,因此结果将是余数和除数的和。 即-2 + 3 = 1
-
5%-3=-1
这里除数和余数都是相反的符号。 结果将是余数与除数之和。 即 2 + -3 = -1
-
-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++ 中最快的排序算法
发布时间: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++ 中,迭代器是一个类似于指针的对象,指向数