第四届蓝桥杯C/C++B组预赛之 第39级阶梯
题目描述
小明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!站在台阶前,他突然又想着一个问题:
如果我每一步只能迈上1个或2个台阶。先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。那么,上完39级台阶,有多少种不同的上法呢? 请你利用计算机的优势,帮助小明寻找答案。
要求提交的是一个整数。
算法分析
首先,题目要求是先出左脚,最后是一步是右脚。那么如果将每出一步SumStep就累加1的话,最后得到的总步数SumStep 应该是一个偶数。
然后,因为每一步可能是1级或2级,一共是39级。因此跨一级的步数Step_1是奇数,即(Step_1%2=1)。
由前面一步可以推断出,跨两级的步数Step_2也是奇数,即((Step_1%2=(39-Step_1)/2)%2=1)。
由以上的分析,可以推断出,该题目可以从排列组合的数学方法求解。先求出满足条件的总步数SumStep,然后根据排列组合求出每一个对应的SumStep可能出现的排列总数,累加起来就是最后的结果。
#include<stdio.h>
/*---------------------------------------------*/
int fun(void);
int Cacul(int Step_1, int SumStep);
/*---------------------------------------------*/
int main(void)
{
int Count;
Count=fun();
printf("%d\n",Count);
Count=getchar();
}
/*---------------------------------------------*/
int fun(void)
{
int count=0;
int Step_1, Step_2;
int SumStep;
for(int i=1; i<=39; i+=2)
{
Step_1=i;
Step_2=(39-Step_1)/2;
if(Step_2%2==1)
{
SumStep=Step_1+Step_2;
count+=Cacul(Step_1,SumStep);
}
}
return count;
}
/*---------------------------------------------*/
int Cacul(int Step_1, int SumStep)
{
int num=1;
for(int j=1; j<=Step_1; j++)
num=num*(SumStep-Step_1+j)/j;
return num;
}
测试结果