斐波那契字符串

218 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目信息

斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13、21、34、……1、1、2、3、5、8、13、21、34、……

在数学上,斐波那契数列以如下递推的形式定义:F(0)=1,F(1)=1,F(n)=F(n−1)+F(n−2)(n≥2,n∈N∗)F(0)=1,F(1)=1,F(n)=F(n−1)+F(n−2)(n≥2,n∈N∗)。

如果一个数出现在斐波那契数列之中,那么我们就称这个数为斐波那契数。

现在,给定一个整数 n,请你构造一个长度为 n 的字符串 s1s2…sn。

对于字符串中的第 i 个字符 si:

  • 如果 i 是斐波那契数,则 si 为大写字母 O
  • 如果 i 不是斐波那契数,则 si 为小写字母 o

输出构造好的字符串。

注意,字符下标从 1 到 n。

输入格式

一个整数 n。

输出格式

一个字符串,表示答案。

数据范围

前三个测试点满足 1≤n≤100。 所有测试点满足 1≤n≤1000。

输入样例1:

8

输出样例1:

OOOoOooO

输入样例2:

15

输出样例2:

OOOoOooOooooOoo

思路

该题主要考察斐波那契数列和对字符串的处理,首先题目给出的数据范围是最高1000,也就是说给出字符串的长度最多为1000,然后根据斐波那契数列发现,第16个数就可以大于1000了,于是我们把0-16的斐波那契数通过递推公式f(n) = f(n - 1) + f(n - 2);全部存入数组中,然后再通过find函数判断给定字符串的每一位是否在改数组中。

代码

#include <iostream>
#include <algorithm>
#include <string.h>
​
using namespace std;
​
const int N = 1010;
​
vector<int> v1;
int q[N];
int n;
​
int feibo_nums(int n){
    if(n < 2) return 1;
    return feibo_nums(n - 1) + feibo_nums(n - 2);
}
​
bool find(vector<int> v1,int x)
{
    for(int i = 0;i < 16;i ++)
    {
        if(v1[i] == x) return true;
    }
    return false;
}
​
int main()
{
    
    cin >> n;
    string a;
    for(int i = 1;i <= n;i ++)
    {
        q[i] = i;
        
    }
    
    for(int i = 0;i < 16;i ++){
        v1.push_back(feibo_nums(i));
    }
   
    
    for(int i = 1; i <= n;i ++){
        if(find(v1,q[i])) a += 'O';
        else a += 'o';
        
    }
    cout << a << endl;
    return 0;
}