一个斐波那契数列题 HDU 2041

来源:互联网 发布:数据正态分布统计方法 编辑:程序博客网 时间:2024/06/11 13:52
有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?
Input
输入数据首先包含一个整数N,表示测试实例的个数,然后是N行数据,每行包含一个整数M(1<=M<=40),表示楼梯的级数。
Output
对于每个测试实例,请输出不同走法的数量
Sample Input
223
Sample Output
12
这道题的思路是逆向思维,最后一级只能是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)中的元素个数。

样例输入

699

样例输出

69042
#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
0 0