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;
}