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


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

在这篇文章中,我们将讨论如何使用 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

示例

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

#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

使用 For 循环

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

示例

#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

使用递归

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

示例

#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 循环来计算握手次数。循环从总人数开始,然后在每次迭代后将计数器减少一个。

示例

#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 的总和。

示例

#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

开启你的职业生涯

完成课程获得认证

开始
广告
© . All rights reserved.