您的位置:首页 > 其它

杭电 1316 How Many Fibs?

2013-05-11 07:33 302 查看
[align=left]Problem Description[/align]
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].

[align=left]Input[/align]
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.

[align=left]Output[/align]
For each test case output on a single line the number of Fibonacci numbers fi with a <= fi <= b.

[align=left]Sample Input[/align]

10 100
1234567890 9876543210
0 0

[align=left]Sample Output[/align]

5
4

[align=left]Source[/align]
University of Ulm Local Contest 2000

[align=left]Recommend[/align]
Eddy

此题与大菲波数那题有些类似,我在处理的时候,都是先用一个二维数组存储大菲波数。不同的是,本题需要对用个用数组存储的所谓大数进行比较,需要写一个大数比较的函数,通过该函数的返回值来判断两个大数的大小,以下是代码:

View Code

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int fib[700][105];

void add( int *num1, int *num2, int *num3 )
{
int i;
memset(num3, 0, 105 * sizeof(int));
for( i = 0; i < 105; i++ )
{
num3[i] += (num1[i] + num2[i]);
if( num3[i] >= 10 )
{
num3[i+1]++;
num3[i] = num3[i] % 10;
}
}
}
int compare( int *num1, int *num2 )
{
//for( i = 104; i >= 0; i-- )
int i, len1, len2, temp;
for( i = 104; i >= 0; i-- )
if( num1[i] != 0 )
break;
len1 = i;
for( i = 104; i >= 0; i-- )
if( num2[i] != 0 )
break;
len2 = i;
if( len1 > len2 )
return 1;
else if( len1 == len2 )
{
temp = len1;
while( (num1[temp] == num2[temp])&&( temp != -1 ) )
temp--;
if( temp == -1 )
return 0;
else
return (num1[temp]- num2[temp]);
}
else
return -1;
}

int main(int argc, char *argv[])
{
int i, len1, len2, cnt, left, right, n;
char s1[105], s2[105];
int  num1[105], num2[105];
memset(fib[0], 0, 110 * sizeof(int));
memset(fib[1], 0, 110 * sizeof(int));
fib[0][0] = 1;
fib[1][0] = 1;
for( i = 2; i < 700; i++ )
add(fib[i-2], fib[i-1], fib[i]);
while( scanf( "%s %s", s1, s2 ) != EOF )
{
//printf( "%s %s\n", s1, s2 );
if( (strcmp( s1, "0" )==0)&&(strcmp( s2, "0" )==0) )
break;
len1 = strlen(s1);
len2 = strlen(s2);
//printf( "%d %d\n", len1, len2 );
memset(num1, 0, 105 * sizeof(int));
memset(num2, 0, 105 * sizeof(int));
cnt = 0;
for( i = len1 - 1; i >= 0; i-- )
num1[cnt++] = s1[i] - '0';
/*for( i = 0; i < cnt; i++ )
printf( "%d", num1[i] );
printf( "\n" );*/
cnt = 0;
for( i = len2 - 1; i >= 0; i-- )
num2[cnt++] = s2[i] - '0';
/*for( i = 0; i < cnt; i++ )
printf( "%d", num2[i] );
printf( "\n" );*/
left = -1;
for( i = 1; i < 700; i++ )
{
if( (compare( fib[i], num1 ) >= 0)&&( left == -1 ) )
left = i;
if( compare( fib[i], num2 ) > 0 )
{
right = i;
break;
}
}
//printf( "%d %d\n", left, right );
printf( "%d\n", right - left );
/*while( scanf( "%d", &n ) != EOF )
{
for( i = 104; i >= 0; i-- )
if( fib
[i] != 0 )
break;
for( ; i >= 0; i-- )
printf( "%d", fib
[i] );
printf( "\n" );
}*/
}
//system("PAUSE");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: