zoukankan      html  css  js  c++  java
  • Fibonacci

    题意:

    求解斐波那契数列第$n$项的前4位数字。

    解法:

    注意到只需要求解前几位数字,这样只要求出$log_{10}{ans}$而后取小数部分$x$,再求出$[10^x * 1000]$即可。

    关键在于求解$log_{10}{F_n}$:

    1.由数列特征根得

    $F_n = frac{1}{ sqrt{5} } ( {x_1}^n - {x_2}^n ) $

    $x_1,x_2$为方程$x^2 = x+1$的解,假定$x_1$为较大的解。

    注意到${x_2}^n$是收敛的,这样可以直接计算出其值,而对于${x_1}^n$则难以计算。

    这样对原式化简得

    $F_n = frac{1}{sqrt{5}} {x_1}^n (1 - (frac{x_2}{x_1})^n )$

    左右取$log_{10}$即可。

    2.由极限分析得,$lim_{x o infty}{ frac{F_{n+1}}{F_n} } = phi$

    从而有$F_n approx F_t * {phi}^{n-t}$

    左右取$log_{10}$即可。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cmath>
     5 
     6 #define LD long double
     7 
     8 using namespace std;
     9 
    10 LD qpow(LD x,int n)
    11 {
    12     LD ans=1;
    13     for(;n;n>>=1,x*=x)
    14         if(n&1) ans*=x;
    15     return ans;
    16 }
    17 
    18 int n;
    19 
    20 int main()
    21 {
    22     while(~scanf("%d",&n))
    23     {
    24         if(n==0)
    25         {
    26             puts("0");
    27             continue;
    28         }
    29         LD rt5 = sqrt(5);
    30         LD log_Fn = -log10(rt5) + n*(LD)log10((rt5+1)/2);
    31         log_Fn += log10(1 - qpow((1-rt5)/(rt5+1),n));
    32         LD tmp = (double)pow(10,log_Fn);
    33         if(tmp <= 10000.0)
    34         {
    35             cout << (int)tmp << endl;
    36             continue;
    37         }
    38         log_Fn -= floor(log_Fn);
    39         cout << (int)(pow(10,log_Fn)*1000.0) << endl;
    40     }
    41     return 0;
    42 }
    View Code
  • 相关阅读:
    遍历文件夹及子文件夹_函数
    wbadmin与vssadmin
    WSB备份到远程共享文件夹的限制
    Linux 性能工具集
    shell 与 空格
    Git 仓库结构 (二)***
    Linux下scp的用法***
    FINDSTR 命令使用详解
    Git 的origin和master分析 ***
    Git push *****
  • 原文地址:https://www.cnblogs.com/lawyer/p/6575239.html
Copyright © 2011-2022 走看看