HDU-How many Fibs-给定区间求斐波那契数数目

来源:互联网 发布:麦哲伦星系 知乎 编辑:程序博客网 时间:2024/06/15 01:29
问题及代码:

Problem B How many Fibs

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 1   Accepted Submission(s) : 1

Font: Times New Roman | Verdana | Georgia

Font Size:  

Problem Description

Recall the definition of the Fibonacci numbers: 
f1 := 1 
f2 := 2 
fn := fn-1 + fn-2 (n >= 3) 

Given two numbers a and b, calculate how many Fibonacci numbers are in the range [a, b]. 

Input

The input contains several test cases. Each test case consists of two non-negative integer numbers a and b. Input is terminated by a = b = 0. Otherwise, a <= b <= 10^100. The numbers a and b are given with no superfluous leading zeros.

Output

For each test case output on a single line the number of Fibonacci numbers fi with a <= fi <= b. 

Sample Input

10 1001234567890 98765432100 0

Sample Output

54


/*    *Copyright (c)2015,烟台大学计算机与控制工程学院    *All rights reserved.    *文件名称:HDU.cpp    *作    者:单昕昕    *完成日期:2015年3月3日    *版 本 号:v1.0        */ #include <iostream>#include <string.h>#include <stdio.h>using namespace std;char fibs[10005][102];void add(int n){    int len_a=strlen(fibs[n-1]),len_b=strlen(fibs[n-2]);    int p=len_a-1,q=len_b-1;    int a[102],left=0;    for (int i=0; i<102; i++)    {        a[i]=left;        if (p>=0)            a[i]+=fibs[n-1][p--]-'0';        if (q>=0)            a[i]+=fibs[n-2][q--]-'0';        left=a[i]/10;        a[i]%=10;    }    int i;    for (i=101; i>=0; i--)    {        if (a[i]!=0)            break;    }    int k=0;    while (i>=0)    {        fibs[n][k++]=a[i--]+'0';    }    fibs[n][k]=0;}bool cmp(char *a,char *b){    int len_a=strlen(a),len_b=strlen(b);    if (len_a>len_b)        return true;    if (len_a<len_b)        return false;    int n=0;    while (n<len_a)    {        if (a[n]-'0'>b[n]-'0')            return true;        if (a[n]-'0'<b[n]-'0')            return false;        n++;    }    return true;}int main(){    strcpy(fibs[0],"1");    strcpy(fibs[1],"2");    int k=1;    while (strlen(fibs[k++])<101)    {        add(k);    }    char a[102],b[102];    while(scanf("%s %s",a,b),strcmp(a,"0")!=0||strcmp(b,"0")!=0)    {        int count=0;        for (int i=0; i<=k; i++)        {            if (cmp(fibs[i],a)==false)                continue;            if (cmp(fibs[i],a)==true && cmp(b,fibs[i])==true)                count++;            if (cmp(b,fibs[i])==false)                break;        }        cout<<count<<endl;    }    return 0;}


运行结果:



知识点总结:
给定区间求斐波那契数数目。

学习心得:

高精度模拟,请收下我的膝盖。。

0 0
原创粉丝点击