[C语言]n个台阶,一步只能走1个台阶或者2个台阶,有几种走法?(非递归)(n==14时结果开始错误,待改正)

#include<stdio.h>
int com(int a, int b)//高中学的排列组合中的组合C(a b),下面有一张图。
{
	int mother = 1, son = 1;//mother是图片中分母的值。son是图片中分子的值。
	int p = a;//因为a存的值,既要用来决定循环次数,又要参与分母的运算,所以用另一个变量p保存a的值来参与mother的运算。
	for (int i = 0; i < a; i++)//求分母的值,分母中有几个数相乘就循环几次。
	{
		mother = mother * p;
		p--;
	}
	for (int i = 0; i < a; i++)//求分子的值,分母中有几个数相乘就循环几次。
	{
		son = son * b;
		b--;
	}
	return son / mother;//因为是组合,所以不可能为小数。
}
int main()
{
	int n = 0, sum = 0;//sum表示走的方法数。
	scanf("%d", &n);//总共n个台阶
	int T1 = n % 2;//走1个台阶的步数
	int T2 = n / 2;//走2个台阶的步数
	int k = T2;//T2存的值既要参与sum的运算,又要决定循环次数,所以用另一个变量k存T2的值来决定循环次数。
	for (int i = 0; i < k + 1; i++)//k之所以加1,是因为在最初时,没有拆【2台阶】情况下,可能存在有一个【1台阶】的情况。也可能存在没有【1台阶】的情况,没有【1台阶】com函数返回的是1,表示全是【2台阶】的一次走法。
	{
		sum = sum + com(T1, T1 + T2);//T1为0时,sum就为1。T1不为0,com就算有几种插入方式。
		T2--;
		T1 += 2;
	}
	printf("%d", sum);
	return 0;
}
//将 一步走一个台阶 表示为【1台阶】,将 一步走两个台阶 表示为【2台阶】。
//假设走T1个【1台阶】再走T2个【2台阶】就能走完。
//那么把每走一步,假设成一个【】,【】中可以存放 1台阶,也可以存放 2台阶。
//总共有T1+T2个【】,将T1个 1台阶 插入到T1+T2个【】中去,剩下的【】全部放 2台阶
//com(a,b)就是计算 有b个【】时,插入a个 1台阶 会有几种插法。

//先从【2台阶】最多的走法开始算sum,然后再把【2台阶】拆掉一个变成两个【1台阶】计算com加到宿命中,依次拆【2台阶】

[C语言]n个台阶,一步只能走1个台阶或者2个台阶,有几种走法?(非递归)(n==14时结果开始错误,待改正)

 

 

上一篇:将Excel数据转换为Java可识别时间(Date、Timestamp)


下一篇:获取唯一Id(20位)