题目如下
小明刚刚看完电影《第39级台阶》。离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!
站在台阶前,他突然又想着一个问题:
如果我每一步只能迈上1个或2个台阶。先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。那么,上完39级台阶,有多少种不同的上法呢?
请你利用计算机的优势,帮助小明寻找答案。
思路
此题既要考虑步数为偶数,又要考虑排列组合,由此想到了高中的排列组合公式,写了排列组合函数,记录下满足要求的偶数步个数和奇数步个数,再由排列组合公式求解!!!
要十分重视阶乘溢出的问题 ,我没想到数字会如此之大,在排列组合函数中C(n,m)中尽量使n小,n直接决定了阶乘的次数!!!
代码如下
#include<stdio.h>
#include<stdlib.h>
long long C(int n, int m)//排列组合函数 ,m下 n上
{
int x, y;
x = n; y = m;
long long she = 1, xhe = 1;
long long i, j, jieguo = 0;
for (i = 0; i < n; i++)
{
she = she * y;
y--;
}
for (j = 0; j < n; j++)
{
xhe = xhe * x;
x--;
}
jieguo = she / xhe;
return jieguo;
}
int main()
{
int a[99]={0};//跨两步的次数
int b[99]={0};//跨一步的次数
int n=39;
int i=0;
int j=0;
int k=0,l=0;
for(i=0;i<=n/2;i++)
{
for(j=0;j<=n;j++)
{
if((2*i+j==n)&&((i+j)%2==0))
{
a[k++]=i;
b[l++]=j;
}
}
}
long long m,pa=0,pb=0;
for(m=0;m<k;m++)
{
pb=a[m];
if(a[m]>b[m])
pb=b[m];
pa+=C(pb,a[m]+b[m]);
}
printf("%d\n",pa);
}