Loading [MathJax]/jax/output/HTML-CSS/jax.js

每人只握手一次的情况下,握手次数


假设你参加一个社交聚会。如果你只和每人握一次手,你能计算出你能握多少次手吗?这个问题对你来说可能很有趣。这可以用排列组合的数学方法来解决。然而,数学运算可能很费时。

在这篇文章中,我们将讨论如何使用 C++ 来解决这个问题。我们将探讨从数学公式到递归和其他组合技术的不同方法。

输入输出场景

假设在一个聚会上你有 N 个人。你想计算出每人只握手一次的情况下可能的握手次数。

Input: N = 16 Output: 120 Input: N = 11 Output: 55

使用握手公式

在 N 个人的聚会中,求握手次数的公式是:

No. of handshakes = N *(N-1) /2

N 个人中的每一个人都会与 (N-1) 个人握手(不包括自己),并且两个人之间的握手不会被计算两次。

例如,如果人数是 14,那么握手次数是

Handshakes = 14 * (14 - 1)/ 2 = 14 * 13 / 2 = 182/2 = 91

示例

在下面的例子中,我们使用计算握手次数的公式。在这里,我们简单地使用数学运算符,并将聚会中的人数作为输入。

Open Compiler
#include <iostream> using namespace std; int count(int N) { // Formula: N * (N-1) / 2 return (N * (N - 1)) / 2; } int main() { int totalIndividuals= 10; int numHandshakes = count(totalIndividuals); std::cout << "Number of handshakes: " << numHandshakes << std::endl; return 0; }

输出

Number of handshakes: 45

Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.

使用 For 循环

在这里,我们通过从 1 迭代到 'N-1' 并将所有值相加来计算握手次数。

示例

Open Compiler
#include <iostream> using namespace std; int count(int N) { int numHandshakes = 0; for (int x = 1; x < N; x++) { numHandshakes += x; } return numHandshakes; } int main() { int totalIndividuals = 10; int numHandshakes = count(totalIndividuals); std::cout << "Number of handshakes: " << numHandshakes << std::endl; return 0; }

输出

Number of handshakes: 45

使用递归

我们可以使用递归来计算握手次数。这样做,我们通过一次考虑一个人来将问题分解成更小的问题。

示例

Open Compiler
#include <iostream> using namespace std; int count(int N) { if (N <= 1) return 0; return (N - 1) + count(N - 1); } int main() { int totalIndividuals = 20; int numHandshakes = count(totalIndividuals); std::cout << "Number of handshakes: " << numHandshakes << std::endl; return 0; }

输出

Number of handshakes: 190

使用 While 循环

在这里,我们使用了一个带有递减计数器的 while 循环来计算握手次数。循环从总人数开始,然后在每次迭代后将计数器减少一个。

示例

Open Compiler
#include <iostream> using namespace std; int count(int N) { int numHandshakes = 0; while (N > 1) { numHandshakes += N - 1; N--; } return numHandshakes; } int main() { int totalIndividuals = 16; int numHandshakes = count(totalIndividuals); std::cout << "Number of handshakes: " << numHandshakes << std::endl; return 0; }

输出

Number of handshakes: 120

使用动态规划

在这里,我们使用了动态规划进行计算。

  • 初始化一个 'dp' 向量来存储握手次数。

  • 从 1 迭代到 N。在每次迭代中,它将握手次数声明为先前握手次数和当前人数减 1 的总和。

示例

Open Compiler
#include <iostream> #include <vector> using namespace std; int count(int N) { std::vector<int> dp(N + 1); dp[0] = 0; for (int x = 1; x <= N; x++) { dp[x] = dp[x - 1] + (x - 1); } return dp[N]; } int main() { int totalIndividuals = 21; int numHandshakes = count(totalIndividuals); std::cout << "Number of handshakes: " << numHandshakes << std::endl; return 0; }

输出

Number of handshakes: 210

注意 − 这种方法有助于避免冗余计算。在这里,我们将先前计算的值存储在 'dp' 向量中,你可以随时访问和重用它。这使得算法更高效。同时也减少了整体计算时间。

结论

我们讨论了各种方法,通过这些方法我们可以计算每人只握手一次的握手次数。这些方法包括使用公式的数学运算符、使用 for 循环、递归、while 循环和动态规划。每种方法都有其自身的优势。动态规划是解决问题的一种更系统和组织化的方法。你可以根据具体需求使用任何一种方法。

更新于:2023年7月12日

浏览量:185

开启你的职业生涯

完成课程获得认证

开始
广告