原题目:HDOJ 1316
主要搞清楚斐波那契数列的数值长度,与数N大致是1:5的关系。1000的斐波那契数为209位,虽然此题变形了一点,但不至于影响太多。
#include <iostream>
#include <string.h>
using namespace std;
#define len 110
int fib[500][110];
void init() {
//初始化500个斐波那契数
fib[0][0] = 1;
fib[1][0] = 2;
for(int i=2; i<500; i++) {
int c = 0;
for(int j = 0; j < 110; j++) {
fib[i][j] = fib[i-1][j] + fib[i-2][j] + c;
c = fib[i][j] / 10;
fib[i][j] = fib[i][j] % 10;
}
}
}
int cmp(int * a,int * b) { //比较两个数的大小
for(int i = len-1; i >= 0; i--) {
if(a[i]!=b[i]) {
return a[i]-b[i];
}
}
return 0;
}
int func(int * a,int * b) {
int count_a=0,count_b=0;
int low=0,high=500-1;
bool flag = true; //标志,查看是否计数值确定 ,其实可以不用,但为了使代码清晰使用
while(low<=high) { //确定左边界
int mid = (low+high)/2;
int value = cmp(a,fib[mid]);
if(value > 0)low = mid+1;
else if(value == 0) {
count_a=mid-1;
flag = false;
break;
} else high=mid-1;
}
if(flag)
count_a=high;
low=0;
high=500-1;
flag = true;
while(low<=high) {
int mid = (low+high)/2; //确定右边界
int value = cmp(b,fib[mid]);
if(value > 0)low = mid+1;
else if(value == 0) {
count_b=mid+1;
flag = false;
break;
} else high=mid-1;
}
if(flag)count_b=low;
return count_b-count_a-1; //计算中间值得个数
}
int main() {
int a[110],b[110];
char a1[110],b1[110];
init();
while(cin>>a1>>b1) {
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
if(a1[0]=='0'&&b1[0]=='0')
break;
int len_a = strlen(a1);
int len_b = strlen(b1);
//将输入的值逆序存储在整型数组中
for(int j = 0; j < len_a; j++) {
a[j] = a1[len_a-1-j] - '0';
}
for(int j = 0; j < len_b; j++) {
b[j] = b1[len_b-1-j] - '0';
}
cout<<func(a,b)<<endl;
}
return 0;
}