TOJ-1345 How Many Fibs?

本文介绍了一种使用字符串操作处理大数Fibonacci数的算法,通过自定义字符串比较和加法函数,实现了对100位十进制数的Fibonacci数列计算,并统计指定范围内Fibonacci数的数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Recall the definition of the Fibonacci numbers:
f 1 := 1
f 2 := 2
f n := f n-1 + f n-2     (n≥3)
Given two numbers a and b, calculate how many Fibonacci numbers are in the range [ a, b].

Input Specification

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≤10100. The numbers a and b are given with no superfluous leading zeros.

Output Specification

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

Sample Input

 

10 100
1234567890 9876543210
0 0

Sample Output

 

5
4



Source: University of Ulm Local Contest 2000

100位的十进制数只好用字符串了。打表。

#include <iostream>
#include <string>
using namespace std;

int cmp(string a,string b){
    int la=a.length(),lb=b.length();
    if(a==b)    return 0;
    if(la<lb)    return -1;
    if(la>lb)    return 1;
    if(la==lb){
        for(int i=0;i<la;i++){
            if(a[i]>b[i])    return 1;
            if(a[i]<b[i])    return -1;
        }
        return 0;
    }
}
string add(string a,string b){
    string t="";
    int la=a.length(),lb=b.length();
    if(la<lb){
        for(int i=0;i<lb-la;i++)
            a = "0"+a;
    }
    else{
        for(int i=0;i<la-lb;i++)
            b = "0"+b;
    }
    int l = a.length();
    int c = 0;
    int n;
    for(int i=l-1;i>=0;i--){
        n = a[i]-'0'+b[i]-'0'+c;
        c = n/10;
        t = char(n%10+'0')+t;
    }
    if(c)    t = char(c+'0')+t;
    return t;
}
string fibs[500];
int main(){
    string a,b;
    int i,j,k,count;
    fibs[0]="0";fibs[1]="1";fibs[2]="2";
    for(i=3;i<500;i++){
        fibs[i]=add(fibs[i-1],fibs[i-2]);
    }
    while(cin>>a>>b,!(a=="0"&&b=="0")){
        count = 0;
        for(i=1;i<500 && cmp(b,fibs[i])>=0;i++){
            if(cmp(fibs[i],a)>=0 && cmp(b,fibs[i])>=0)
                count++;
        }
        cout<<count<<endl;
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/shenchuguimo/p/6382525.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值