您的位置:首页 > 其它

UVa 10183 - How Many Fibs?

2013-01-29 09:17 405 查看
求区间[a,b]内斐波那契数的个数,因为最大到了10的100次方,初步递推一下,10的100次方左右,可达到斐波那契数列的第480项左右,因此用暴力枚举+大数加法即可。

代码如下:

#include <cstdio>
#include <cstring>
#include <cmath>
char fibo[480][105];
void Fibonacci(char *a, char *b, char *c)//斐波那契数列打表
{
int len = strlen(a);
for(int i=0; i<len; i++)
{
c[i] += a[i] + b[i] - '0';
if(c[i] < '0')
c[i] += '0';
if(c[i] > '9')
{
c[i] -= 10;
++c[i+1];
}
}
if(c[len]==1)
c[len] += '0';
}
int Compare(char *a, char *b)//比较两个大数的大小
{
int len_a = strlen(a), len_b(strlen(b));
if(len_a > len_b)
return 1;
else if(len_a < len_b)
return -1;
for(int i=0; i<len_a; i++)
if(a[i] > b[len_b-i-1])
return 1;
else if(a[i] < b[len_b-i-1])
return -1;
return 0;
}
int main()
{
#ifdef test
freopen("sample.txt", "r", stdin);
#endif
char a[105], b[105];
fibo[0][0] = 1+'0';
fibo[1][0] = 2+'0';
for(int i=2; i<=480; i++)
Fibonacci(fibo[i-1], fibo[i-2], fibo[i]);
// for(int i=1; i<=480; i++)
// {//打表测试10的100次方内斐波那契数列的项数
// printf("(%d)", strlen(fibo[i]));
// for(int j=strlen(fibo[i])-1; j>=0; j--)
// printf("%c", fibo[i][j]);
// puts("");
// }
while(scanf("%s%s", a, b) != EOF)
{
if(!strcmp(a, "0") && !strcmp(b, "0"))
break;
int ct1, ct2;
for(int i=0; i<=480; i++)
if(Compare(a, fibo[i]) <= 0)
{
ct1 = i;
break;
}
for(int i=ct1; i<=480; i++)
if(Compare(b, fibo[i]) < 0)
{
ct2 = i;
break;
}
printf("%d\n", ct2 - ct1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: