第四届“图灵杯”NEUQ-ACM程序设计竞赛(团队赛)-网络同步赛C(大数斐波那契数)

来源:互联网 发布:人人商城2.0 源码下载 编辑:程序博客网 时间:2024/05/22 18:18

问题 C: 来简单地数个数
时间限制: 1 Sec 内存限制: 64 MB
提交: 728 解决: 232
[提交][状态][讨论版]
题目描述
这是一个斐波那契数列:
f1 = 1
f2 = 2
fn = fn-1 + fn-2 (n>=3)
蔡老板想知道,给你两个数a、b,你能否求出在区间[a,b]里有多少个斐波那契数。

输入
多组数据输入。一行为一组输入数据,包括两个非负整数a、b(a <= b <= 10^100),当a=b=0时输入终止。

输出
对每组输入,输出单独一行,包含一个整数表示区间[a,b]里的斐波那契数个数。

样例输入
10 100
1234567890 9876543210
0 0
样例输出
5
4
题解:因为a,b太大,所以按字符串做,先预处理出前1000个数。然后判断即可。
代码:

#include<iostream>#include<stdio.h>#include<stdlib.h>#include<algorithm>#include<vector>#include<string.h>#define ll long longusing namespace std;//const int N=1e5+10;//*****************************wo zhan de dai ma******************const int mod=1000000007;const int N=1005;int fib[N][105];int f[N][105];int h[N];void Solve(){    memset(fib,0,sizeof(fib));    h[0]=0;h[1]=0;    fib[0][0]=1;fib[1][0]=1;    for(int i=2;i<N;i++)    {        for(int j=0;j<105;j++)        {            fib[i][j]+=fib[i-1][j]+fib[i-2][j];            if(fib[i][j]>=10)            {                fib[i][j]-=10;                fib[i][j+1]++;            }        }        for(int j=104;j>=0;j--)        {            if(fib[i][j])            {                h[i]=j;                break;            }        }    }}bool compare1(char *str,int len,int a[],int n){    if(n<len) return true;    if(n>len) return false;    for(int i=0;i<n;i++)    {        if(str[i]-'0'>a[i]) return true;        if(str[i]-'0'<a[i]) return false;    }    return true;}bool compare2(char *str,int len,int a[],int n){    if(n>len) return true;    if(n<len) return false;    for(int i=0;i<n;i++)    {        if(str[i]-'0'<a[i]) return true;        if(str[i]-'0'>a[i]) return false;    }    return true;}char a[105],b[105];int main(){    Solve();    for(int i=0;i<N;i++)        for(int j=h[i];j>=0;j--)            f[i][h[i]-j]=fib[i][j];    int record1,record2;    while(cin>>a>>b)    {        if(a==0&&b==0)break;        int len1=strlen(a);        int len2=strlen(b);        if(len1==1&&len2==1&&a[0]=='0'&&b[0]=='0') break;        for(int i=1;i<N;i++)        {            if(compare2(a,len1,f[i],h[i]+1))            {                record1=i;                break;            }        }        for(int i=N-1;i>=1;i--)        {            if(compare1(b,len2,f[i],h[i]+1))            {                record2=i;                break;            }        }        cout<<record2-record1+1<<endl;    }    return 0;}
阅读全文
0 0
原创粉丝点击