您的位置:首页 > 其它

POJ 2413 How many Fibs?(高精度)

2012-06-18 21:33 295 查看
题目链接

复习的好累啊,刷个题。。。题意简单给两个数,找中间有多少个斐波那契数,最大可能有100位。

先预处理出来,大数比较,我用的方法比较搞,以前做UVA的时候想出的一种方法,先判断位数,然后位数相同时,用strcmp函数来判断,因为此函数,可以判断两个字符串的字典序大小,然后注意点找的时候小细节就OK了。。。难得的1Y,话说UVA那个高精度 我还没过啊,UVA上各种坑人啊,如果数据有前导0,此算法悲剧。。。

#include <stdio.h>
#include <string.h>
int p[601][201],num[601];
char str[601][201];
int main()
{
int i,j,len1,len2;
char a[101],b[101];
p[1][0] = 1;p[2][0] = 2;
num[1] = num[2] = 0;
for(i = 3;i <= 500;i ++)
{
num[i] = num[i-1];
for(j = 0;j <= num[i];j ++)
{
p[i][j] = p[i-1][j] + p[i-2][j];
}
for(j = 0;j <= num[i];j ++)
{
if(p[i][j] > 9)
{
p[i][j+1] += p[i][j]/10;
p[i][j] = p[i][j]%10;
if(j+1>num[i])
num[i] = j + 1;
}
}
}
for(i = 1;i <= 500;i ++)
{
for(j = 0;j <= num[i];j ++)
{
str[i][num[i]-j] = p[i][j] + '0';
}
str[i][num[i]+1] = '\0';
}
while(scanf("%s%s",a,b)!=EOF)
{
if(a[0] == '0'&&b[0] == '0')
break;
len1 = strlen(a) - 1;
len2 = strlen(b) - 1;
for(i = 1;;i ++)
{
if(num[i] >= len1)
{
if(num[i] == len1)
{
if(strcmp(str[i],a)>=0)
break;
}
else
break;
}
}
for(j = i;;j ++)
{
if(num[j] >= len2)
{
if(num[j] == len2)
{
if(strcmp(str[j],b)>0)
break;
}
else
break;
}
}
printf("%d\n",j-i);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: