zoukankan      html  css  js  c++  java
  • HDU 1568 Fibonacci ★(取科学计数法)

    题目大意:问fibonacci数列的第n项的前四个数.   很好的一道题~~~如果取后几位的话,取模就可以了,但取前几位显然没这么简单= =…… 但假如我们能把它表示成小数(科学计数法)的话,那么要取几位我们乘对应的几个10就可以了(前提是取的位数在计算机表示小数的精确范围之内)~~~   取对数log10可以非常美的完成它: 假设给出一个数10234432,那么log10(10234432)=log10(1.0234432*10^7)=log10(1.0234432)+7; log10(1.0234432)就是log10(10234432)的小数部分. log10(1.0234432)=0.010063744 10^0.010063744=1.023443198 那么要取几位就很明显了吧~ 先取对数(对10取),然后得到结果的小数部分bit,pow(10.0,bit)以后如果答案还是<1000那么就一直乘10。  
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #define MID(x,y) ((x+y)>>1)
    const double f=(sqrt(5.0)+1.0)/2.0;
    using namespace std;
    typedef long long LL;
    
    int fab[21];
    int main(){
        int n;
        fab[1] = 1;
        for (int i = 2; i <= 20; i ++)
            fab[i] = fab[i-1] + fab[i-2];
        while(cin >> n){
            if (n <= 20){
                cout << fab[n] << endl;
                continue;
            }
            double log10_fabn = -0.5*log(5.0)/log(10.0)+((double)n)*log(f)/log(10.0);//忽略最后一项无穷小
            log10_fabn = log10_fabn - (int)log10_fabn;
            double num = pow(10, log10_fabn);
            while(num < 1000)
                num *= 10;
            cout << (int)num <
     
    举杯独醉,饮罢飞雪,茫然又一年岁。 ------AbandonZHANG
  • 相关阅读:
    面试官:讲讲redis的过期策略如何实现?
    Java并发-CopyOnWriteArrayList
    Java并发-CopyOnWriteArrayList
    idea万能快捷键,不可不知的17个实用技巧
    Java面试题必备知识之ThreadLocal
    Java面试题必备知识之ThreadLocal
    再谈源码阅读
    再谈源码阅读
    七月伊始 LeetCode算法总结
    ta和夏天一起来了
  • 原文地址:https://www.cnblogs.com/AbandonZHANG/p/4114213.html
Copyright © 2011-2022 走看看