这是应用数学专业的一道C语言题,挺水的一道题倒是引发了我不少感慨。
一开始用递归做,考虑暴力穷举,就像这样:
#include <stdio.h>
long long cnt;
int n;
void solve(int u)
{
int i;
if (u == 0)
{
cnt++;
return;
}
for (i = 1; i <= u; i++)
{
solve(u - i);
}
}
int main()
{
scanf("%d", &n);
solve(n);
printf("%lld", cnt);
return 0;
}
然后,n=50的时候就超时了,想想这也是肯定的Orz
后来换了个思路,考虑分几步走完台阶,可以一步走完,分两步走完……也可以分n步每步走一个台阶。
考虑高中学过的隔板法,分i步走时有
种走法,那么所有走法就是:
实现成代码。。。。
#include <stdio.h>
#include <math.h>
int main()
{
int n;
long long ans;
scanf("%d", &n);
ans = round(pow(2, n - 1));
printf("%lld", ans);
return 0;
}
这一共才几行(噗)如果问题都能总结成数学公式那要能多简单。。。