C++ 中的 std::gcd 函数
本文将解释如何在 C++ 中使用 STL 数值库中的 std::gcd
和其他有用的数学函数。
使用 std::gcd
函数在 C++ 中计算两个整数的最大公约数
STL 使用 <algorithm>
头提供了多种算法,但它也提供了强大的数学函数,其中一些可以被认为是数值算法。这些函数是使用标题 - numeric
提供的。
我们将探索计算两个整数的最大公约数的 std::gcd
函数。最大公约数是将每个给定整数相除的最大正整数。
std::gcd
接受两个整数值(m
和 n
)并返回 |m|
和 |n|
的最大公约数。如果 m
和 n
碰巧都为零,则该函数也返回零。下面的示例代码演示了 std::gcd
的基本用法,并将相应的结果打印到控制台。
#include <iomanip>
#include <iostream>
#include <numeric>
#include <vector>
using std::cout;
using std::endl;
using std::setw;
using std::vector;
int main() {
std::vector<std::pair<int, int>> vec = {
{12125, 1235}, {124, 1122}, {-1235, 321}, {12, 144}};
for (const auto &item : vec) {
cout << "Greatest common divisor of " << setw(5) << item.first << " and "
<< setw(5) << item.second << " is "
<< std::gcd(item.first, item.second) << endl;
}
return EXIT_SUCCESS;
}
输出:
Greatest common divisor of 12125 and 1235 is 5
Greatest common divisor of 124 and 1122 is 2
Greatest common divisor of -1235 and 321 is 1
Greatest common divisor of 12 and 144 is 1
在 C++ 中使用 std::lcm
函数来计算两个整数的最小公约数
数字库中提供的另一个类似函数是 std::lcm
,它计算两个整数的最小公倍数。该函数接受两个类似于 std:gcd
的整数,并返回|m|
和|n|
(表示参数)的最小公约数。
请注意,这两个函数都有 constexpr
指定符,这意味着它们可能用于常量表达式,并且该函数也获得了 inline
分类。
#include <iomanip>
#include <iostream>
#include <numeric>
#include <vector>
using std::cout;
using std::endl;
using std::setw;
using std::vector;
int main() {
std::vector<std::pair<int, int>> vec = {
{12125, 1235}, {124, 1122}, {-1235, 321}, {12, 144}};
for (const auto &item : vec) {
cout << "Least common multiple of " << setw(5) << item.first << " and "
<< setw(5) << item.second << " is "
<< std::lcm(item.first, item.second) << endl;
}
return EXIT_SUCCESS;
}
输出:
Least common multiple of 12125 and 1235 is 2994875
Least common multiple of 124 and 1122 is 69564
Least common multiple of -1235 and 321 is 396435
Least common multiple of 12 and 144 is 144
使用 std::midpoint
函数在 C++ 中计算两个数字的中点
std::midpoint
是一个功能强大的函数,用于计算两个给定数字的一半,而用户无需担心溢出。即,如果我们尝试计算两个大整数的一半,它们的总和大于 64 位整数的上限,那么我们就会溢出,结果将是错误的。
例如,以下代码片段试图找到两个整数的中点,其中一个与 uint64_t
中可以存储的最大数相同,另一个小于 10。请注意,使用常用算术运算符的计算会产生错误的数字,而 std::midpoint
返回正确的结果。
请注意,此函数自 C++20 标准以来一直是语言的一部分,可能在旧版本中不可用。std::midpoint
也适用于指针值,但给定的指针应该是同一数组的元素。否则,行为是未定义的。
#include <iomanip>
#include <iostream>
#include <numeric>
#include <vector>
using std::cout;
using std::endl;
using std::setw;
using std::vector;
int main() {
uint64_t a = std::numeric_limits<uint64_t>::max();
uint64_t b = std::numeric_limits<uint64_t>::max() - 10;
cout << "a: " << a << '\n'
<< "b: " << b << '\n'
<< "Incorrect: " << setw(20) << (a + b) / 2 << '\n'
<< "Correct : " << setw(20) << std::midpoint(a, b) << endl;
return EXIT_SUCCESS;
}
输出:
a: 18446744073709551615
b: 18446744073709551605
Incorrect: 9223372036854775802
Correct : 18446744073709551610
相关文章
如何在 C++ 中实现毫秒级的睡眠
发布时间:2024/01/02 浏览次数:124 分类:C++
-
本文介绍了在 C++ 中使用不同方法暂停程序执行,实现睡眠的方法。本文介绍了在 C++ 中睡眠毫秒的方法。使用 std::this_thread::sleep_for 方法在 C++ 中睡眠
如何在 C++ 中将双精度数四舍五入到整数上
发布时间:2024/01/02 浏览次数:88 分类:C++
-
本文演示了如何在 C++ 中把双精度数四舍五入到整数中。本文将为大家讲解几种在 C++ 中如何将双精度数四舍五入为整数的方法。使用 round() 函数将双精度数四舍五入到整数
如何在 C++ 中以毫秒为单位获取时间
发布时间:2024/01/02 浏览次数:60 分类:C++
-
本文介绍了如何在 C++ 中获取以毫秒为单位的时间。本文将介绍多种 C++ 方法,介绍如何以毫秒为单位获取时间。
如何在 C++ 中把 Char 数组转换为 Int
发布时间:2024/01/02 浏览次数:90 分类:C++
-
本文演示了在 C++ 中把 char 数组转换为 int 类型的方法。本文将介绍将 char 数组转换为 int 类型的 C++ 方法。使用 std::strtol 函数将 char 数组转换为 int 类型
如何在 C++ 中将 ASCII 码转换为字符
发布时间:2024/01/02 浏览次数:183 分类:C++
-
本文介绍了在 C++ 中如何将 ASCII 值转换为 char 的方法。本文将演示关于如何在 C++ 中把 ASCII 值转换为字符的多种方法。在 C++ 中使用赋值运算符将 ASCII 值转换为字符
如何在 C++ 中把十进制转换为二进制
发布时间:2024/01/02 浏览次数:71 分类:C++
-
本文介绍如何在 C++ 中把十进制数转换成二进制数。本文将介绍几种在 C++ 中如何将十进制数转换为二进制表示的方法。在 C++ 中使用自定义定义的函数将十进制数转换为二进制数
如何在 C++ 中把枚举型转换为字符串
发布时间:2024/01/02 浏览次数:138 分类:C++
-
本文演示了如何在 C++ 中把枚举转换为字符串。本文将解释几种在 C++ 中把枚举类型转换为 string 变量的方法。使用 const char*数组将枚举类型转换为字符串
在 C++ 创建一个字典
发布时间:2024/01/02 浏览次数:191 分类:C++
-
本文介绍了如何在 C++ 中创建一个字典。使用初始化列表构造函数在 C++ 中创建字典 在 C++ 标准容器库中,有一个名为 std::map 的字典,它实现了具有唯一键的排序键值对。
如何在 C++ 中将文本追加到文件
发布时间:2024/01/02 浏览次数:95 分类:C++
-
本文介绍了如何用 C++ 将文本追加到文件中的方法。使用 std::ofstream 和 open() 方法将文本追加到文件中