HDU 1316 斐波那契数列+高精度

How Many Fibs?

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4235    Accepted Submission(s): 1669

Problem Description

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].

Input

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.

Output

For each test case output on a single line the number of Fibonacci numbers fi with a <= fi <= b.

Sample Input

10 100

1234567890 9876543210

0 0

Sample Output

5

4

题意:

给定范围[a,b](a<=b<=10^100),求在这范围内的斐波那契数有多少个。

思路:

在我印象中,1000项的斐波那契数好像就有200多位了,枚举1---1000项的斐波那契数放到数组里,然后strcmp求在[a,b]之间的斐波那契的个数。

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <vector>
 5 #include <iostream>
 6 using namespace std;
 7
 8 char a[110], b[110];
 9 char f[1005][500];
10 int f1[500];
11 int f2[500];
12
13 void init_f(){                 //高精度加法初始化斐波那契数f[]
14     strcpy(f[0],"1");
15     strcpy(f[1],"1");
16     int i, j, k, l, r;
17     for(i=2;i<=1000;i++){
18         int n1=strlen(f[i-2]);
19         int n2=strlen(f[i-1]);
20         memset(f1,0,sizeof(f1));
21         memset(f2,0,sizeof(f2));
22         for(j=n1-1;j>=0;j--) f1[j]=f[i-2][n1-j-1]-‘0‘;
23         for(j=n2-1;j>=0;j--) f2[j]=f[i-1][n2-j-1]-‘0‘;
24         int c=0;
25         while(j<=max(n1,n2)){
26             f1[j]=f1[j]+f2[j]+c;
27             if(f1[j]>=10) {
28                 f1[j]-=10;c=1;
29             }
30             else c=0;
31             j++;
32         }
33         k=max(n1,n2);
34         while(!f1[k]) k--;          //去掉后面多余的0
35         for(j=k;j>=0;j--) f[i][j]=f1[k-j]+‘0‘;
36
37     }
38 }
39
40
41 main()
42 {
43     init_f();
44     int ans;
45     while(scanf("%s%s",a,b)!=EOF&&(strcmp(a,"0")||strcmp(b,"0"))){
46         int n1=strlen(a), n2=strlen(b);
47         int flag;
48         if(n1==n2) flag=1;
49         else flag=0;
50         ans=0;
51         for(int i=1;i<=1000;i++){
52             int n=strlen(f[i]);
53             if(flag){                                 //当a和b的长度一样时
54                 if(n==n1&&strcmp(f[i],a)>=0&&strcmp(f[i],b)<=0) ans++;
55                 if(n>n1||n==n1&&strcmp(f[i],b)>0) break;
56                 continue;
57             }
58             if(n>n2||n==n2&&strcmp(f[i],b)>0) break;      //当a和b的长度不一样时
59             if(n>n1&&n<n2) {
60                 ans++;continue;
61             }
62             if(n==n1&&strcmp(f[i],a)>=0) ans++;
63             if(n==n2&&strcmp(f[i],b)<=0) ans++;
64         }
65         printf("%d\n",ans);
66     }
67 }

HDU 1316 斐波那契数列+高精度,布布扣,bubuko.com

时间: 2024-10-17 20:26:21

HDU 1316 斐波那契数列+高精度的相关文章

HDU 1316 (斐波那契数列,大数相加,大数比较大小)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1316 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]. Input The input c

hdu 4549 M斐波那契数列(快速幂 矩阵快速幂 费马小定理)

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4549: 题目是中文的很容易理解吧.可一开始我把题目看错了,这毛病哈哈. 一开始我看错题时,就用了一个快速幂来解,不用说肯定wa,看题目的通过率也不高,我想会不会有啥坑啊.然而我就是那大坑,哈哈. 不说了,直接说题吧,先讨论k=1,2,3;时的解.这应该会解吧,不多说了: 从第四项开始f(4)=a^1+b^2;f(5)=a^2+b^3;f(6)=a^3+b^5......; 看出来了吧,a上的指数成斐波

HDU 4639 Hehe(字符串处理,斐波纳契数列,找规律)

题目 //每次for循环的时候总是会忘记最后一段,真是白痴.... //连续的he的个数 种数 //0 1 //1 1 //2 2 //3 3 //4 5 //5 8 //…… …… //斐波纳契数列 //不连续的就用相乘(组合数)好了 #include<iostream> #include<algorithm> #include<string> #include <stdio.h> #include <string.h> #include &l

hdu 4549 M斐波那契数列(矩阵快速幂,快速幂降幂)

http://acm.hdu.edu.cn/showproblem.php?pid=4549 f[0] = a^1*b^0%p,f[1] = a^0*b^1%p,f[2] = a^1*b^1%p.....f[n] = a^fib[n-1] * b^fib[n-2]%p. 这里p是质数,且a,p互素,那么我们求a^b%p,当b很大时要对b降幂. 因为a,p互素,那么由费马小定理知a^(p-1)%p = 1.令b = k*(p-1) + b',a^b%p = a^(k*(p-1)+b')%p = a

HDU 4549 M斐波那契数列 ( 矩阵快速幂 + 费马小定理 )

HDU 4549 M斐波那契数列 (  矩阵快速幂 + 费马小定理  ) 题意:中文题,不解释 分析:最好的分析就是先推一推前几项,看看有什么规律 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef __int64 LL; #define CLR( a, b ) memset( a, b, sizeof(a) ) #define MOD 100000

【矩阵快速幂】HDU 4549 : M斐波那契数列(矩阵嵌套)

[题目链接]click here~~ [题目大意] M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给出a, b, n,你能求出F[n]的值吗?对每组测试数据请输出一个整数F[n],由于F[n]可能很大,你只需输出F[n]对1000000007取模后的值即可,每组数据输出一行. [Source] :2013金山西山居创意游戏程序挑战赛――初赛(2) [解题思路] 这个题稍微有点难度,就

HDU 4549 M斐波那契数列(矩阵快速幂)

Problem Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给出a, b, n,你能求出F[n]的值吗? Input 输入包含多组测试数据: 每组数据占一行,包含3个整数a, b, n( 0 <= a, b, n <= 10^9 ) Output 对每组测试数据请输出一个整数F[n],由于F[n]可能很大,你只需输出F[n]对1000000007取模

HDU 5451 广义斐波那契数列

这道题目可以先转化: 令f(1) = 5+2√6 f(2) = f(1)*(5+2√6) ... f(n) = f(n-1)*(5+2√6) f(n) = f(n-1)*(10-(5-2√6)) = 10*f(n-1)-(5-2√6)f(n-1) = 10*f(n-1) - 10/(5+2√6) f(n-1) = 10*f(n-1) - 10/(5+2√6) * (5+2√6)f(n-2) = 10*f(n-1) - f(n-2) 那么就可以写成矩阵相乘的形式了 (f(n) , f(n-1))

HDU 4549 M斐波那契数列(矩阵快速幂&amp;费马小定理)

ps:今天和战友聊到矩阵快速幂,想到前几天学长推荐去刷矩阵专题,挑了其中唯一一道中文题,没想到越过山却被河挡住去路... 题目链接:[kuangbin带你飞]专题十九 矩阵 R - M斐波那契数列 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u 题意 Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2]