栈—输出栈的次序总数

问题描述:

 

宁宁考虑的是这样一个问题:一个操作数序列,从1,2,一直到n,栈A的深度大于n。 现在可以进行两种操作: 1. 进栈操作push 2. 出栈操作pop 使用这2个操作,由一个操作数序列就可以得到一系列的输出序列。 例如,对于一个操作数序列1 2 3,那么出栈序列为: (1)1 2 3 (2)3 2 1 (3)2 1 3 (4)2 3 1 (5)1 3 2 现在对于任意一个N,输入端的数据一定是1,2,3...N。求出可能出现的输出端数据序列的种数。

输入:

第一行为一个数字T,表示有T组数据。 每组数据只含一个整数n(1≤n≤9)

输出:

对于每组数据,输出可能得到的输出序列的总数目。

输入样式:

1

3

输出样式:

5

解题原理:

这里用了栈里面的总次序的一个数学公式,,其中cnt就是我们要求的总次数,而n是指一个栈中存在几个数。

我将这个经过化解后,得到cnt=[(2n)!/(n!*n!)]/(n+1).因此我写了一个factorial来专门处理阶乘。然后用c语言写出这个式子,运算即可。

代码:

#include<stdio.h>
long long int  factorial(int n)
{
	long long int sum=1;
	
	for (int i=1;i<=n;i++){
		sum*=i;
	}
	return sum;
}
int main()
{
	int n,m;
	scanf("%d",&m);
	while(m--){
		scanf("%d",&n);
		long long int sum;
		sum=factorial(2*n)/(factorial(n)*factorial(n));
		sum=sum/(n+1);
		printf("%lld\n",sum);
	}
	
	return 0;
	
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值