[hdu 1568] Fibonacci数列前4位

2007年到来了。经过2006年一年的修炼,数学神童zouyu终于把0到100000000的Fibonacci数列
(f[0]=0,f[1]=1;f[i] = f[i-1]+f[i-2](i>=2))的值全部给背了下来。
接下来,CodeStar决定要考考他,于是每问他一个数字,他就要把答案说出来,不过有的数字太长了。所以规定超过4位的只要说出前4位就可以了,可是CodeStar自己又记不住。于是他决定编写一个程序来测验zouyu说的是否正确。

Input

输入若干数字n(0 <= n <= 100000000),每个数字一行。读到文件尾。

Output

输出f[n]的前4个数字(若不足4个数字,就全部输出)。

Sample Input

0
1
2
3
4
5
35
36
37
38
39
40

Sample Output

0 1 1 2 3 5 9227 1493 2415 3908 6324 1023

思路:

求Fibonacci数列的前4位数,如果直接递推或用矩阵递推会存不下,这里用公式来直接求。

求12345678的前4位,可以先取对数log10(12345678) = log10(1.2345678*10^7) = log10(1.2345678)+7

log10(1.2345678) < 1, 所以对原数向下取整可得到t = log10(1.2345678), 再取pow(10.0, t),可得到1.2345678

运用double只精确保留指定位数的小数的特性来舍去后面的数,保留前面的数。

这题中:Fibonacci有如下公式:

经过化简后可得:

也就是先取以10为底的对数,再取指数,得到整数及前几位小数部分

#include <iostream>
#include <stdio.h>
#include <cstring>
#include <math.h>
#include <algorithm>

using namespace std;
int a[30];  //<=25

int main()
{
    //freopen("1.txt", "r", stdin);
    a[1] = 1; a[2] = 1;
    for (int i = 3; i <= 27; i++) {
        a[i] = a[i-1]+a[i-2];
    }
    int N;
    while (~scanf("%d", &N)) {
        if (N <= 20) {
            printf("%d\n", a[N]);
            continue;
        }
        double t = 0;
        double s = (sqrt(5.0)+1.0)/2.0;
        t = -0.5*log(5.0)/log(10.0) + (double)N*log(s)/log(10.0);
        t = t-floor(t);
        t = pow(10.0, t);
        while (t < 1000)
            t *= 10;
        printf("%d\n", (int)t);
    }

    return 0;
}
时间: 2024-10-03 23:15:31

[hdu 1568] Fibonacci数列前4位的相关文章

hdu 1568 Fibonacci

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1568 数学....囧...害我低沉了好几天提不起劲做题. 用到了斐波那契数列的通项公式. 先看对数的性质,loga(b^c)=c*loga(b),loga(b*c)=loga(b)+loga(c); 假设给出一个数10234432,那么log10(10234432)=log10(1.0234432*10^7)=log10(1.0234432)+7;log10(1.0234432)就是log10(10

HDU 1568 Fibonacci【求斐波那契数的前4位/递推式】

Fibonacci Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description 2007年到来了.经过2006年一年的修炼,数学神童zouyu终于把0到100000000的Fibonacci数列 (f[0]=0,f[1]=1;f[i] = f[i-1]+f[i-2](i>=2))的值全部给背了下来. 接下来,CodeStar决定要考考他,于是每问他一

hdu 1568 Fibonacci (数论)

Fibonacci Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3654    Accepted Submission(s): 1671 Problem Description 2007年到来了.经过2006年一年的修炼,数学神童zouyu终于把0到100000000的Fibonacci数列 (f[0]=0,f[1]=1;f[i]

NYOJ 461-Fibonacci数列(四)(求斐波那契数列前4位)

题目地址:NYOJ 461 思路:斐波那契数列的通项公式为 然后下一步考虑如何产生前4位: 先看对数的性质,loga(b^c)=c*loga(b),loga(b*c)=loga(b)+loga(c);假设给出一个数10234432, 那么log10(10234432)=log10(1.0234432*10^7)[用科学记数法表示这个数]=log10(1.0234432)+7; log10(1.0234432)就是log10(10234432)的小数部分. log10(1.0234432)=0.0

HDU - 3117 Fibonacci Numbers 矩阵快速幂 + 取大数前4位

题目大意:要求输出第n个fibonacci数,如果该数超过1e9,就输出该数的前4位和后四位 解题思路:通过打表可得,第40个fibonacci数是大于1e9的,所以40之前的可以直接计算 40之后的比较麻烦,参考了别人的题解 http://blog.sina.com.cn/s/blog_9bf748f301019q3t.html #include<cstdio> #include<cmath> using namespace std; typedef long long ll;

hdu 1568(Fibonacci)(就是大数的斐波那契公式)

Fibonacci Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3569    Accepted Submission(s): 1627 Problem Description 2007年到来了.经过2006年一年的修炼,数学神童zouyu终于把0到100000000的Fibonacci数列 (f[0]=0,f[1]=1;f[i]

常系数线性递推的第n项及前n项和 (Fibonacci数列,矩阵)

(一)Fibonacci数列f[n]=f[n-1]+f[n-2],f[1]=f[2]=1的第n项的快速求法(不考虑高精度). 解法: 考虑1×2的矩阵[f[n-2],f[n-1]].根据fibonacci数列的递推关系,我们希望通过乘以一个2×2的矩阵,得到矩阵[f[n-1],f[n]]=[f[n-1],f[n-1]+f[n-2]] 很容易构造出这个2×2矩阵A,即: 0 1 1 1 所以,有[f[1],f[2]]×A=[f[2],f[3]] 又因为矩阵乘法满足结合律,故有: [f[1],f[2

HDU 3117 Fibonacci Numbers(斐波那契前后四位,打表+取对+矩阵快速幂)

HDU 3117 Fibonacci Numbers(斐波那契前后四位,打表+取对+矩阵快速幂) ACM 题目地址:HDU 3117 Fibonacci Numbers 题意: 求第n个斐波那契数的前四位和后四位. 不足8位直接输出. 分析: 前四位有另外一题HDU 1568,用取对的方法来做的. 后四位可以用矩阵快速幂,MOD设成10000就行了. 代码: /* * Author: illuz <iilluzen[at]gmail.com> * Blog: http://blog.csdn.

hdu 3117 Fibonacci Numbers

点击此处即可传送到hdu 3117 **Fibonacci Numbers** Problem Description The Fibonacci sequence is the sequence of numbers such that every element is equal to the sum of the two previous elements, except for the first two elements f0 and f1 which are respectively