一个斐波那契数列题 HDU 2041

有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法? Input
输入数据首先包含一个整数N,表示测试实例的个数,然后是N行数据,每行包含一个整数M(1<=M<=40),表示楼梯的级数。
Output
对于每个测试实例,请输出不同走法的数量
Sample Input
2
2
3
Sample Output
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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值