首页 > 代码库 > 杭电1316
杭电1316
How Many Fibs?
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3804 Accepted Submission(s): 1498
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].
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 100 1234567890 9876543210 0 0
Sample Output
5 4
#include <cstdio> #include <cstring> #include <cstdlib> #include <vector> #include <cmath> #include <iostream> #include <algorithm> #include <string> #include <map> using namespace std; const int maxn=500; const int base=1000000; const int INF=99999999; const int MIN=-INF; char a[maxn][500]; char* add(char*a,char*b)//大数加法 { int lena=strlen(a); int lenb=strlen(b); int i,j,k; char c[500]; if(lena<lenb) { strcpy(c,a); strcpy(a,b); strcpy(b,c); } int A[500]= {0},B[500]= {0}; for(j=0,i=lena-1; i>=0; i--,j++) A[j]=a[i]-‘0‘; int lenA=j; for(i=lenb-1,j=0; i>=0; i--,j++) B[j]=b[i]-‘0‘; int lenB=j; for(i=0; i<lenB; i++) A[i]+=B[i]; for(i=0; i<500; i++) { if(A[i]>9) { A[i+1]+=A[i]/10; A[i]%=10; } } for(i=500-1; i>=0; i--)if(A[i]!=0)break; for(j=0; i>=0; i--) c[j++]=A[i]+‘0‘; c[j]=‘\0‘; return c; } int comper(char*a,char*b)//自定义比较函数 相同是0 大于是1 小于是-1 { int lena=strlen(a); int lenb=strlen(b); if(lena>lenb) return 1; else if(lena<lenb) return -1; else if(lena==lenb) { for(int i=0; i<lena; i++) if(a[i]<b[i]) return -1; else if(a[i]>b[i]) return 1; } return 0; } int main() { int n,m,i,j,k,t; a[1][0]=‘1‘; a[2][0]=‘2‘; for(i=3; i<=maxn; i++) { strcpy(a[i],add(a[i-1],a[i-2])); } //for(i=1;i<50;i++) // cout<<a[i]<<endl; char a1[maxn],b1[maxn]; while(cin>>a1>>b1) { int lena1=strlen(a1); int lenb1=strlen(b1); if(lena1==1&&lenb1==1&&a1[0]==‘0‘&&b1[0]==‘0‘)return 0; int cnt=0; for(i=1; i<maxn; i++) { if(comper(a[i],a1)>=0&&comper(a[i],b1)<=0) cnt++; } cout<<cnt<<endl; } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。