题目描述
下n级台阶,每步可下1级或2级台阶。那么从n级台阶下到地面,共有多少种不同的下台阶方案?
输入:n
输出:方案数
多行输入,每一行输入一个正整数n,表示n级台阶
输出格式每一行输出n级台阶的方案数
样例输入
1 2样例输出
1 2
DevCpp可以编译通过,而学堂在线OJ系统不通过的代码:
#include <iostream>
using namespace std;
int N = 10; //台阶数,方便可调
int main()
{
int n[N] = {0};
int i = 0;
while(cin>>n[i]) //输入台阶数
i++;
int scheme_1 = 1, scheme_2 = 2; //给最简单的两种方案赋初值
int scheme[N] = {0};
int ben_xiang = 0, shang_xiang = 0, qian_xiang = 0; //不用数组递推,节约内存空间
for(int j = 0; j < i; j++)
{
qian_xiang = scheme_1;
shang_xiang = scheme_2;
if(n[j] >= 3)
{
for(int k = 3; k <= n[j]; k++)
{
ben_xiang = shang_xiang + qian_xiang;
qian_xiang = shang_xiang;
shang_xiang = ben_xiang; //递推公式,这个规律在草稿纸上推得
}
scheme[j] = ben_xiang;
}
if(n[j] == 1) scheme[j] = scheme_1;
if(n[j] == 2) scheme[j] = scheme_2; //尤其要注意循环变量和数组下标
}
for(int j = 0; j < i; j++)
cout << scheme[j] << endl;
return 0;
}
错误提示如下:
Main.cpp: In function 'int main()':
Main.cpp:9:15: error: variable-sized object 'n' may not be initialized
int n[N] = {0};
^
Main.cpp:14:20: error: variable-sized object 'scheme' may not be initialized
int scheme[N] = {0};
^
经查,这是因为OJ编译器版本比较老旧造成的,定义数组大小时必须使用常量,不能用变量。
测试结果:
令我惊奇地发现:这个问题背后的数学规律,居然也是斐波那契数列!要是把题目改成或一次走1级、或一次走2级、或一次走3级,那就不能用斐波那契数列来递推了。
把定义数组长度时的变量N改为常量20以后,代码就能顺利通过OJ测试了!代码如下:
#include <iostream>
using namespace std;
int main()
{
int n[20] = {0};
int i = 0;
while(cin>>n[i]) //输入台阶数
i++;
int scheme_1 = 1, scheme_2 = 2; //给最简单的两种方案赋初值
int scheme[20] = {0};
int ben_xiang = 0, shang_xiang = 0, qian_xiang = 0; //不用数组递推,节约内存空间
for(int j = 0; j < i; j++)
{
qian_xiang = scheme_1;
shang_xiang = scheme_2;
if(n[j] >= 3)
{
for(int k = 3; k <= n[j]; k++)
{
ben_xiang = shang_xiang + qian_xiang;
qian_xiang = shang_xiang;
shang_xiang = ben_xiang; //递推公式,这个规律在草稿纸上推得
}
scheme[j] = ben_xiang;
}
if(n[j] == 1) scheme[j] = scheme_1;
if(n[j] == 2) scheme[j] = scheme_2; //尤其要注意循环变量和数组下标
}
for(int j = 0; j < i; j++)
cout << scheme[j] << endl;
return 0;
}