现在有字符串组:
第0项a0=“IAKIOI”;
第1项a1=“WHENWILLSCORLLOFTAIWUCOMEOUT!!!”;
之后的第k项由第k−2项+第k−1项构成。
问第n项字符串的第c个字符是什么。
格式
输入格式:
两个整数n,c意义如题
输出格式:
一个字符表示答案
样例 1
输入:
5 6
输出:
I
备注
数据范围:0≤n≤80,1≤c≤第n项字符串的长度
1.暴力代码:6/10,超内存
#include <bits/stdc++.h>
using namespace std;
int n, c1;
string b1[85];
int main()
{
cin >> n >> c1;
string b = "IAKIOI";
string c = "WHENWILLSCORLLOFTAIWUCOMEOUT!!!";
char d = 'b';
char e = 'c';
b1[0] = "b";
b1[1] = "c";
for (int i = 2; i <= n; i++)
{
b1[i] = b1[i - 2] + b1[i - 1];
}
int i = 0;
while (1)
{
if (b1[n][i] == 'b')
{
if (c1 > 6)
{
c1 -= 6;
}
else if (c1 <= 6)
{
cout << b[c1-1];
break;
}
}
else if (b1[n][i] == 'c')
{
if (c1 > 31)
{
c1 -= 31;
}
else if (c1 <= 31)
{
cout << c[c1-1];
break;
}
}
i++;
}
}
2.用int存。因为每次顺序都是固定的,都是第k项(左右两边拼起来)=第k-2项(左半边)+第k-1项(右半边),所以如果c<=k-2,则在左半边,即在第k-2项中;else在右半边k-1项中。之后继续递归到a0或a1即可。
注意点:开long long ,最后别忘记写return 0;
#include <bits/stdc++.h>
using namespace std;
long long int n, c;
long long int num[85];
string a0 = "IAKIOI";
string a1 = "WHENWILLSCORLLOFTAIWUCOMEOUT!!!";
void f(long long int n, long long int c)
{ // 递归函数,找c在k-1项 or k-2项中,一直递归直到c在a0和a1中
if (n == 0)
{
cout << a0[c - 1];
return;
}
if (n == 1)
{
cout << a1[c - 1];
return;
}
// 第k项=第k-2项+第k-1项
if (c <= num[n - 2])
{ // c在前k-2项中
f(n - 2, c);
}
else
{ // c在后k-1项中
f(n - 1, c - num[n - 2]);
}
}
int main()
{
cin >> n >> c;
num[0] = 6, num[1] = 31;
for (long long int i = 2; i <= n; i++)
{
num[i] = num[i - 2] + num[i - 1];
}
f(n, c);
return 0;
}