1143 多少个Fibonacci数

时间限制:500MS  内存限制:65536K
提交次数:270 通过次数:16

题型: 编程题   语言: C++;C

Description

给你如下Fibonacci 数的定义:
F1 = 1
F2 = 2
Fn = Fn-1 + Fn-2 (n >= 3)
给你两个数a与b,现要求你计算在a与b之间(包括a、b)有多少个Fibonacci 数

输入格式

有多行,每行有两个数a、b,使用空格分隔,a <= b <= 10^100(即最大10的100次方)
最后一行为两个0

输出格式

除了最后一行,其它每一行要求输出在a与b之间的Fibonacci 数的个数,一行一个

输入样例

10 100
1234567890 9876543210
0 0

输出样例

5
4

作者

admin

思路:这道题一早就盯着他了,但是一直以为自己不会做(a,b<=10^100) 被范围吓到了

后来在hdu 中做了一道题http://acm.hdu.edu.cn/showproblem.php?pid=1715,大概题意是给出n,求fb的第n项F(n), n的范围是<1000

前1000项的fb是很大的,有1、2百位,这只能用数组存了,那就可以用高精度加法,把前1000项的fb制成表;

而在这道题中,是给出a ,b  求a到b之间的fb个数,同上面的方法,先打一个前1000项的fb表(大数加法),然后 a,b在表中找位置(大数比较),那么他们之间的个数就是了

#include<cstdio>
#include<cstring>
char fb[1005][1000];//存储前1000项的fb
//高精度比较,返回1表示a>b  返回-1表示a=b   0表示a<b
int bcmp(char a[],char b[])
{
    int i,n,m;
    n=strlen(a);
    m=strlen(b);
    if(n>m) return 1;//先比长度
    else if(n<m) return 0;
    else//长度相同的时候再从高位开始逐一比较
    {
        for(i=0; i<n; i++)
        {
            if(a[i]>b[i]) return 1;
            else if(a[i]<b[i]) return 0;
            else continue;
        }
    }
    return -1;//全部比较完毕,以上return未生效      就是 a=b
}
//高精度加法
void bplus(char a[],char b[],int t)
{
    int c[1000],d[1000];
    memset(c,0,sizeof(c));
    memset(d,0,sizeof(d));
    int n,m,i,j,k;
    i=1;
    n=strlen(a);
    m=strlen(b);
    //字符数组转为整形数组 ,逆置存放
    for(k=n-1; k>=0; k--)
        c[i++]=a[k]-‘0‘;
    j=1;
    for(k=m-1; k>=0; k--)
        d[j++]=b[k]-‘0‘;

    k=n>m?n:m;
    for(i=1; i<=k; i++)
    {
        c[i+1]+=(c[i]+d[i])/10;
        c[i]=(c[i]+d[i])%10;
    }
    if(c[k+1]) k=k+1;
    //将整形数组,转化为字符数组存在fb数组
    j=0;
    for(i=k; i>=1; i--)
        fb[t][j++]=c[i]+‘0‘;
}
int main()
{
    int i,j;
    char s1[1000],s2[1000];
    memset(fb,‘\0‘,sizeof(fb));
    fb[1][0]=‘1‘;
    fb[2][0]=‘2‘;
    //打表
    for(i=3; i<=1000; i++)
        bplus(fb[i-2],fb[i-1],i);

    while(scanf("%s%s",s1,s2))
    {
        int cnt=0;
        if(!((s1[0]-‘0‘)||(s2[0]-‘0‘))) break;
        for(i=1; i<=1000; i++)
        {
            //查找a的位置 i
            if(bcmp(fb[i],s1)==-1)
            {
                cnt=1;
                i++;
                break;
            }
            if(bcmp(fb[i],s1)>0)
            {
                cnt=0;
                break;
            }
        }
        for(j=i; j<=1000; j++)
            if(bcmp(fb[j],s2)<=0) cnt++;
            else break;
        printf("%d\n",cnt);
    }
    return 0;
}
时间: 2024-12-09 09:25:16

1143 多少个Fibonacci数的相关文章

Fibonacci数

Fibonacci数 描述 无穷数列1,1,2,3,5,8,13,21,34,55...称为Fibonacci数列,它可以递归地定义为F(n)=1 ...........(n=1或n=2)F(n)=F(n-1)+F(n-2).....(n>2)现要你来求第n个斐波纳奇数.(第1个.第二个都为1) 输入 第一行是一个整数m(m<5)表示共有m组测试数据每次测试数据只有一行,且只有一个整形数n(n<20) 输出 对每组输入n,输出第n个Fibonacci数 实现: package July;

利用JavaScript打印出Fibonacci数(不使用全局变量)

从汤姆大叔的博客里看到了6个基础题目:本篇是第4题 - 利用JavaScript打印出Fibonacci数(不使用全局变量) 解题关键: 1.Fibonacci数列的规律 2.递归 解点1:Fibonacci数列的规律 1,1,2,3,5,6,13,19,32.... //从第3项开始,每项都是前两项之和 解点2:递归 递归是一个复杂的概念,此题可以不用递归解决,但题目要求不能使用全局变量,所以我只能想到递归方法.简单的说,递归就是函数调用函数本身,但递归一定要有一个出口,否则就无限调用下去……

每日一小练——快速Fibonacci数算法

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:快速Fibonacci数算法 内容:先说说Fibonacci数列,它的定义是数列:f1,f2....fn有如下规律: 尝试寻找快速的求出fn的方法 我的解法:上来没多想,打开vs2013就敲了起来,问题果然很简单,分分钟就超神..奥,不对就解决了! 其实题目中就给出了这个算法的递归形式,所以首先我想到的是递归解法,不过因为求解快速方法在递归之前,我编写了一个非递归的算法 #include <iostream> usi

hdu 2041(递推、dp/组合数学```其实就是Fibonacci数```)

最经典的Fibonacci数,上楼梯每次能跨一步或者两步,问有多少中跨法: 对于最后一次跨一步或者两步,走到第 i 阶,其种类总数就是走到 i - 1 的总数 + 走到i - 2 的总数:于是 a [ i ] = a [ i - 1 ] + a [ i - 2 ]:当然,那个时候的我是用```组合数学做的``` 1 #include<stdio.h> 2 long long c(int a,int b) 3 { 4 long long i,sum=1,j; 5 for (i=a,j=1;i&g

求Fibonacci数的三种方法和时间复杂度解析

题目: 定义Fibonacci数列如下: f(0)=1 f(1)=1 f(n)=f(n-1)+f(n-2), n>=2 输入n,用最快的方法求该数列的第n项. 解答一: 直接用公式写递归函数.很简单,很低效,就不写了.时间复杂度T(N) = T(N-1) + T(N-2); 也是f(n)本身,2^(n/2)<f(n)<2^n. 解答二: 用循环求,也很直接,效率很高了,时间复杂度是O(n). int f(int n) { if(n <= 1) return 1; int f0=1,

Fibonacci数列是这样定义的: F[0] = 0 F[1] = 1 for each i ≥ 2: F[i] = F[i-1] + F[i-2] 因此,Fibonacci数列就形如:0, 1, 1, 2, 3, 5, 8, 13, ...,在Fibonacci数列中的数我们称为Fibonacci数。给你一个N,你想让其变为一个Fibonacci数,每一步你可以把当前数字X变为X-1或者X+1

Fibonacci数列是这样定义的:F[0] = 0F[1] = 1for each i ≥ 2: F[i] = F[i-1] + F[i-2]因此,Fibonacci数列就形如:0, 1, 1, 2, 3, 5, 8, 13, ...,在Fibonacci数列中的数我们称为Fibonacci数.给你一个N,你想让其变为一个Fibonacci数,每一步你可以把当前数字X变为X-1或者X+1,现在给你一个数N求最少需要多少步可以变为Fibonacci数. 输入描述: 输入为一个正整数N(1 ≤ N

每日一小练——高速Fibonacci数算法

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:高速Fibonacci数算法 内容:先说说Fibonacci数列,它的定义是数列:f1,f2....fn有例如以下规律: 尝试寻找高速的求出fn的方法 我的解法:上来没多想,打开vs2013就敲了起来,问题果然非常easy,分分钟就超神..奥,不正确就攻克了! 事实上题目中就给出了这个算法的递归形式,所以首先我想到的是递归解法,只是由于求解高速方法在递归之前,我编写了一个非递归的算法 #include <iostrea

nyist 13 Fibonacci数

Fibonacci数 时间限制:3000 ms  |  内存限制:65535 KB 难度:1 描述 无穷数列1,1,2,3,5,8,13,21,34,55...称为Fibonacci数列,它可以递归地定义为F(n)=1 ...........(n=1或n=2)F(n)=F(n-1)+F(n-2).....(n>2)现要你来求第n个斐波纳奇数.(第1个.第二个都为1) 输入 第一行是一个整数m(m<5)表示共有m组测试数据每次测试数据只有一行,且只有一个整形数n(n<20) 输出 对每组输

ACM Fibonacci数 计算

Fibonacci数 时间限制:3000 ms  |  内存限制:65535 KB 难度:1 描述 无穷数列1,1,2,3,5,8,13,21,34,55...称为Fibonacci数列,它可以递归地定义为F(n)=1 ...........(n=1或n=2)F(n)=F(n-1)+F(n-2).....(n>2)现要你来求第n个斐波纳奇数.(第1个.第二个都为1) 输入 第一行是一个整数m(m<5)表示共有m组测试数据每次测试数据只有一行,且只有一个整形数n(n<20) 输出 对每组输