zoukankan      html  css  js  c++  java
  • hdu 1568 Fibonacci

    题目

    本来想用矩阵快速幂来做,无果。。。

    于是用:斐波拉契数列通项公式。。

    由于这里数值会很大,但我们只需要前四位,所以应利用log取对数来解决

    分析:

        123456=1.23456*10^5;
        log10(123456)=5.09151;
        log10(1.23456*10^5)=log10(1.23456)+log10(10^5)=0.09151+5;

    因为要取前4位,所以只用关心小数部分即可,小数点向后移动4位。

    注意,(1-√5)/2)^n 由于其数值很小,所以可忽略。
    m^{n} = 10^{n*log10(m))} 先将n*log10(m)算出来,取其小数部分,再10的乘方,得整数部分为最m^n第一位数,继续乘10直到为4位数为止。

    
    #include<stdio.h>
    #include<math.h>
    int main()
    {
        int n,f,fib[21];
        double num;
    
        fib[0]=0,fib[1]=1;    //由于接下来利用公式得出来的数不是精确的,越小的数则越不精确,所以前面一些fib数自己算
        for(int i=2; i<21; i++)  //当n超过20时,fib数就超过4位了,所以算前21个就可以了
            fib[i]=fib[i-1]+fib[i-2];
        while(~scanf("%d",&n))
        {
            if(n<=20)
            {
                printf("%d
    ",fib[n]);
                continue;
            }
            num=n*log10((1+sqrt(5.0))/2.0)-log10(sqrt(5.0));
            num=num-int(num);
            num=pow(10,num);
            while(num<1000)
                num*=10;
            f=num;   //把浮点数转为整数,防止进位
            printf("%d
    ",f);
        }
        return 0;
    }
    
  • 相关阅读:
    洛谷1968美元汇率 dp
    洛谷luogu2782
    题解 AT2243 【正方形のチップ】
    [HAOI2006]聪明的猴子 题解
    D:苏卿念发红包
    c++小游戏——扫雷
    c++小游戏——拯救公主
    c++小游戏——三国杀
    C++小游戏——井字棋
    c++小游戏——杀手
  • 原文地址:https://www.cnblogs.com/qie-wei/p/12094119.html
Copyright © 2011-2022 走看看