POJ 2413 How many Fibs?(高精度)

题目链接

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

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

 1 #include <stdio.h>
 2 #include <string.h>
 3 int p[601][201],num[601];
 4 char str[601][201];
 5 int main()
 6 {
 7     int i,j,len1,len2;
 8     char a[101],b[101];
 9     p[1][0] = 1;p[2][0] = 2;
10     num[1] = num[2] = 0;
11     for(i = 3;i <= 500;i ++)
12     {
13         num[i] = num[i-1];
14         for(j = 0;j <= num[i];j ++)
15         {
16             p[i][j] = p[i-1][j] + p[i-2][j];
17         }
18         for(j = 0;j <= num[i];j ++)
19         {
20             if(p[i][j] > 9)
21             {
22                 p[i][j+1] += p[i][j]/10;
23                 p[i][j] = p[i][j]%10;
24                 if(j+1>num[i])
25                 num[i] = j + 1;
26             }
27         }
28     }
29     for(i = 1;i <= 500;i ++)
30     {
31         for(j = 0;j <= num[i];j ++)
32         {
33             str[i][num[i]-j] = p[i][j] + '0';
34         }
35         str[i][num[i]+1] = '\0';
36     }
37     while(scanf("%s%s",a,b)!=EOF)
38     {
39         if(a[0] == '0'&&b[0] == '0')
40         break;
41         len1 = strlen(a) - 1;
42         len2 = strlen(b) - 1;
43         for(i = 1;;i ++)
44         {
45             if(num[i] >= len1)
46             {
47                 if(num[i] == len1)
48                 {
49                     if(strcmp(str[i],a)>=0)
50                     break;
51                 }
52                 else
53                 break;
54             }
55         }
56         for(j = i;;j ++)
57         {
58             if(num[j] >= len2)
59             {
60                 if(num[j] == len2)
61                 {
62                     if(strcmp(str[j],b)>0)
63                     break;
64                 }
65                 else
66                 break;
67             }
68         }
69         printf("%d\n",j-i);
70     }
71     return 0;
72 }

转载于:https://www.cnblogs.com/naix-x/archive/2012/06/18/2554031.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值