描述
楼梯有n(71>n>0)阶台阶,上楼时可以一步上1阶,也可以一步上2阶,也可以一步上3阶,编程计算共有多少种不同的走法。
格式
输入格式
输入的每一行包括一组测试数据,即为台阶数n。最后一行为0,表示测试结束。
输出格式
每一行输出对应一行输入的结果,即为走法的数目。
(1)那就完全模拟(发现数据太大行不通!)
#include<stdio.h>
int time;//种数
//1 2 3
int fun(int n){
for (int i = 1; i <= 3; i++){
if (n - i >= 0){
if (n - i == 0){//走完了
n = 0;
time++; printf("%d ", time);
return 1;
}
fun(n-i);
}
else return 0;
}
}
int main(){
int n;
do{
scanf("%d", &n);
if (n == 0)break;
time = 0;
fun(n);
printf("%d\n", time);
} while (n != 0);
return 0;
}
输入70运行居然十分钟还没结束,肯定不行了;
根据输出结果发现有规律:ans(n)=ans(n-1)+ans(n-2)+ans(n-3);其实这也是类似一种斐波那契数列(百度百科);
于是:
(2)直接数学计算(虽然我给了100级的空间,但是会发现也只能算70级,大了会溢出,更多级就考虑用数组来存一个超大数)
#include<stdio.h>
long long a[100];
long long fun(){
a[1]= 1;
a[2]= 2;
a[3]= 4;
for (int i = 4; i <= 99; i++){
a[i] = a[i - 1] + a[i - 2] + a[i - 3];
}
return 0;
}
int main(){
int n;
fun();
do{
scanf("%d", &n);
if (n == 0)break;
printf("%lld\n", a[n]);
} while (1);
return 0;
}