zoukankan      html  css  js  c++  java
  • Project Euler Problem 104 Pandigital Fibonacci ends

    Pandigital Fibonacci ends

    Problem 104

    The Fibonacci sequence is defined by the recurrence relation:

    Fn = Fn−1 + Fn−2, where F1 = 1 and F2 = 1.

    It turns out that F541, which contains 113 digits, is the first Fibonacci number for which the last nine digits are 1-9 pandigital (contain all the digits 1 to 9, but not necessarily in order). And F2749, which contains 575 digits, is the first Fibonacci number for which the first nine digits are 1-9 pandigital.

    Given that Fk is the first Fibonacci number for which the first nine digits AND the last nine digits are 1-9 pandigital, findk.


    C++:

    #include <iostream>
    #include <cstdio>
    
    using namespace std;
    
    typedef unsigned long long ULL;
    
    const ULL ulmax = ~((ULL)0);
    const ULL ulmax10 = ulmax / 10;
    const ULL N = 1000000000;
    
    bool ispandigital(ULL n) {
        int digits = 0b1111111110;
    
        while (n) {
            digits ^= 1 << (n % 10);
            n /= 10;
        }
    
        return !digits;
    }
    
    int main()
    {
        ULL f1l=1, f2l=1, nextleft;
        ULL f1r=1, f2r=1, nextright;
        int k = 2;
    
        for(;;) {
            k++;
    
            nextright = (f1r + f2r) % N;
            f1r = f2r;
            f2r = nextright;
    
            nextleft = f1l + f2l;
            if(nextleft >= ulmax10) {
                nextleft /= 10;
                f2l /= 10;
            }
            f1l = f2l;
            f2l = nextleft;
    
            while(nextleft > N)
                nextleft /= 10;
            if(ispandigital(nextleft) && ispandigital(nextright)) {
                cout << k << endl;
                break;
            }
        }
    
        return 0;
    }


    C++:

    #include <iostream>
    #include <cstring>
    #include <cmath>
    
    using namespace std;
    
    const long N = 1000000000;
    
    const double r5 = sqrt(5.0);
    const double lgr = log10((1.0 + r5) / 2.0);
    const double lr5 = log10(r5);
    
    bool ispandigital(long v)
    {
        int digits[10], d;
    
        memset(digits, 0, sizeof(digits));
    
        while(v) {
            d = v % 10;
            if(digits[d])
                return false;
            digits[d] = 1;
            v /= 10;
        }
        if(digits[0])
            return false;
    
        for(int i=1; i<10; i++)
            if(digits[i] == 0)
                return false;
    
        return true;
    }
    
    bool ispandigital2(long n) {
        int digits = 0b1111111110;
    
        while (n) {
            digits ^= 1 << (n % 10);
            n /= 10;
        }
    
        return !digits;
    }
    
    int main()
    {
        long f1=1, f2=1, next, k=2;
    
        for(;;) {
            k++;
            next = (f1 + f2) % N;
            if(ispandigital2(next)) {
                double d = (double)k * lgr - lr5;
                long t = (long)pow(10.0, 8.0 + d - floor(d));
    
                if(ispandigital2(t)) {
                    cout << k << endl;
                    break;
                }
            }
    
            f1 = f2;
            f2 = next;
        }
    
        return 0;
    }

    参考链接:Project Euler problem 104

  • 相关阅读:
    抽象类和接口的区别
    排序之快速排序(quickSort)
    互联网协议入门(1)
    字符串的操作String
    Java笔试题之SQL语句(单表)
    求职之Java开发所需技能
    【更新完毕啦!】一篇完整的产品体验报告处女作
    阿里2015暑期实习生业务型产品笔试题(附部分参考答案)
    滴滴笔试题(附我的答案)
    【面试】蘑菇街产品运营二面&结果
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7563993.html
Copyright © 2011-2022 走看看