题目大意:
给定两个数字a和b,计算a和b之间有多少Fibonacci数字
解题思路:
大数相加和比较
代码如下:
#include <stdio.h>
#include <string.h>
char a[102], b[102], len_a, len_b;
int low[102], high[102], num[102], num2[102];
int cmp(int *x, int *y)
{
int i, last_x, last_y;
last_x = last_y = 101;
while (x[last_x] == 0)
{
last_x--;
}
while (y[last_y] == 0)
{
last_y--;
}
if(last_x < last_y) return -1;
if(last_x > last_y) return 1;
for(i = last_x; i >= 0; i--)
{
if(x[i] > y[i]) return 1;
if(x[i] < y[i]) return -1;
}
return 0;
}
void get_next(void)
{
int i, add, temp[102], last_num;
last_num = 101;
while(num[last_num] == 0)
{
last_num--;
}
for(i = 0; i <= last_num+1; i++)
temp[i] = num[i];
add = 0;
for(i = 0; i <= last_num+1; i++)
{
num[i] += num2[i] + add;
if(num[i] >= 10)
{
add = 1;
num[i] -= 10;
}
else add = 0;
}
for(i = 0; i <= last_num+1; i++)
num2[i] = temp[i];
}
int main(void)
{
int i, cnt;
while (scanf("%s %s", a, b) != EOF && (strcmp(a, "0") || strcmp(b, "0")))
{
for(i = 0; i < 102; i++)
low[i] = high[i] = num[i] = num2[i] = 0;
cnt = 0;
num[0] = num2[0] = 1;
len_a = strlen(a);
len_b = strlen(b);
for(i = 0; i < len_a; i++)
low[i] = a[len_a-1-i] - '0';
for(i = 0; i < len_b; i++)
high[i] = b[len_b-1-i] - '0';
while (cmp(num, low) < 0)
{
get_next();
}
while (cmp(num, high) <= 0)
{
cnt++;
get_next();
}
printf("%d\n", cnt);
}
return 0;
}