每日一题之斐波那契循环数

问题描述

对于一个有 n 位的十进制数 N=d1d2d3…dn,可以生成一个类斐波那契数列S,数列 S 的前 n 个数为:

{S1=d1,S2=d2,S3=d3,…,Sn=dn}

数列 S 的第k(k>n) 个数为:

i=k−nk−1Sii=k−n∑k−1​Si​

如果这个数 N 会出现在对应的类斐波那契数列 S 中,那么 N 就是一个类斐波那契循环数。

例如对于 197,对应的数列 S 为:

{1,9,7,17,33,57,107,197,…}

197出现在 S 中,所以 197 是一个类斐波那契循环数。

请问在 0 至 1e7 中,最大的类斐波那契循环数是多少?

答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

#include 
#include 
#include 
using namespace std;

// 检查 N 是否是类斐波那契循环数
bool isFibonacciLike(int N) {
    vector digits;  // 存储 N 的每一位数字
    int temp = N;
    while (temp > 0) {
        digits.push_back(temp % 10);
        temp /= 10;
    }
    reverse(digits.begin(), digits.end());  // 反转,得到正确的数字顺序

    int n = digits.size();  // N 的位数
    vector S = digits;  // 初始化数列 S

    // 生成数列 S,直到超过 10^7 或找到 N
    while (true) {
        int nextTerm = 0;
        for (int i = S.size() - n; i < S.size(); i++) {
            nextTerm += S[i];
        }
        if (nextTerm > 1e7) break;  // 超过范围,退出
        S.push_back(nextTerm);
        if (nextTerm == N) return true;  // 找到 N
    }
    return false;
}

int main() {
    // 从 10^7 到 0 遍历,找到最大的类斐波那契循环数
    for (int i = 1e7; i >= 0; i--) {
        if (isFibonacciLike(i)) {
            cout << i << endl;
            break;
        }
    }
    return 0;
}

模拟题目是最简单的逻辑,我们可以求出每个数对应的斐波那契数列,然后去去找是否有这个数,一开始我的逻辑太混乱,总想着去求出这个数列的所有数,但是其实只要去判断下一个数是不是我们要找的数就好了

你可能感兴趣的:(算法,数据结构)