有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?
Input
输入数据首先包含一个整数N,表示测试实例的个数,然后是N行数据,每行包含一个整数M(1<=M<=40),表示楼梯的级数。
Output
对于每个测试实例,请输出不同走法的数量
Sample Input
Sample Output
2 2 3
1 2
这道题的思路是逆向思维,最后一级只能是m-1步或是m-2步总的走法就是m-1的走法加上m-2的走法,即最后一级的前一级的走法
递推公式就是F(n) = F(n-1) + F(n-2)
令F(1) = 1 , F(2) = 2
也就是斐波拉基递推
#include<stdio.h>
int diao[10000]={0,1,2};
int qian(int x);
int main(){
int a,i; scanf("%d",&a);
while(a--)
{
scanf("%d",&i);
if(i==1){printf("0\n");continue;}
if(i>1)
{
i=qian(i-1);
printf("%d\n",i);
}
}
}
int qian(int x){
if(diao[x]>0)
return diao[x];
diao[x]=qian(x-1)+qian(x-2);
return diao[x];
}
这个题的精髓在于函数中递归的时候定义了一个全局变量的数组,递归之后把结果储存在数组之后,下次使用的时候直接调用,避免了多次的计算,极大的节省了程序运行的时间,运用这个方法的还有下面这个题,也是一个我感觉很不错的题
题目描述
问题描述: 给定一个自然数n,由n开始可以依次产生半数集set(n)中的数如下。 (1) n∈set(n); (2) 在n的左边加上一个自然数,但该自然数不能超过最近添加的数的一半; (3) 按此规则进行处理,直到不能再添加自然数为止。 例如,set(6)={6,16,26,126,36,136}。半数集set(6)中有6 个元素。 注意半数集是多重集。 编程任务: 对于给定的自然数n,编程计算半数集set(n)中的元素个数。
输入
输入数据m行,每行给出一个整数n。(0〈n〈1000)
输出
输出只有m行,每行给出半数集set(n)中的元素个数。
样例输入
6 99
样例输出
6 9042
#include<stdio.h>
long
diao[10000]={0};
int
qian(
int
x);
main()
{
int
a,sum;
while
(
scanf
(
"%d"
,&a)!=EOF)
{
sum=0;
sum=qian(a);
printf
(
"%d\n"
,sum);
}
}
int
qian(
int
x)
{
int
i,ans=1;
if
(diao[x]>0)
return
diao[x];
for
(i=1;i<=x/2;i++)
ans+=qian(i);
diao[x]=ans;
return
ans;
}
我也是新手,希望能帮到各位看我博客的新手,运行的时候不要直接复制我的代码,因为数据已经失效了,必须在编译器上重新打一遍,喜欢的话赞一下吧O(∩_∩)O