C++ 中使用结合运算符乘以 n 个元素的方法


在这个问题中,我们给定一个整数 n,表示元素的数量。我们的任务是创建一个程序来计算使用结合运算符乘以 n 个元素的方法数量。

**结合运算符**无论数字的排列方式如何,都返回相同的结果。

让我们举个例子来理解这个问题:

输入

3

输出

12

解释

(x*(y*z)), (x*(z*y)), (y*(x*z)), (y*(z*x)), (z*(x*y)), (z*(y*x)),
((x*y)*z), ((y*x)*z), ((x*z)*y), ((z*x)*y), ((z*y)*x), ((y*z)*x).

为了解决这个问题,我们将尝试找到是否存在任何关系或可以创建的任何类型的序列,以便我们可以概括我们的结果。让我们看看基于运算符数量的结合运算符的数量:

1 => 1
2 => 2
3 => 12

现在,让我们尝试概括计数。假设我们正在为 n 个元素创建结合运算符,那么我们可以放置 n-1 个乘法运算符和 n-1 个括号。

在这里,我们将以两种方式排列它们:

  • 考虑乘以直到 (**n-1**) 的方法。然后,我们可以将最后一个元素 an 插入关联的任意一端。这对于 n-1 个数字将形成 2*2*(n-2) 个关联,用于 n 个运算符。

  • 然后,我们将考虑 (a1, a2, … a(n-1)) 的乘法,并将 an 乘以左侧或右侧,这提供了创建关联的两种额外方法。

让我们添加并获取使用上述情况的 n 个运算符的总关联。

ass(n) = ((2*2*(n-2))(ass(n-1))) + 2*(ass(n-1))
ass(n) = (4n-8)(ass(n-1)) + 2*(ass(n-1))
ass(n) = (4n-6)(ass(n-1))

此关系与伪卡塔兰数相同,它具有相同的公式和相同的初始值。

因此,我们可以在此处应用伪卡塔兰数的一般公式:

ass(n) = (2*n-2)!/(n-1)!

让我们看看我们的公式在 n = 5 时的工作情况。

ass(10) = (2*5 - 2)!/ (5-1)!
ass(10) = 8!/4! = 40320/24 = 1680

查找使用结合运算符乘以 n 个元素的方法的程序

// 查找使用结合运算符乘以 n 个元素的方法的程序:

示例

实时演示

#include<iostream>
using namespace std;
long int calcFactorial(int n){
   if (n == 0 || n == 1)
      return 1 ;
   return n*calcFactorial(n-1);
}
long int calcWays ( int n ){
   int N = 2*n - 2 ;
   int R = n - 1 ;
   return (calcFactorial((2*n)-2)/calcFactorial(n-1));
}
int main(){
   int n = 7;
   cout<<"The ways to multiply "<<n<<" elements with an associative operation : "<<calcWays(n);
   return 0 ;
}

输出

The ways to multiply 7 elements with an associative operation : 665280

更新于:2020-07-17

88 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告