fish在无数次oi竞赛的狱炼之后,悟出一个真理,往往越容易的题目,陷阱越深。由此,fish创作了这道题目。 fish首先给出两个短串A=’4567’ (4个字符), B=’123’(3个字符)。反复进行如下的操作得到一个长串C。 (1)C=B+A (例如:A=’4567’ ,B=’123’ C=B+A=’1234567’) (2)A=B B=C (上述例子 A=’123’ B=’1234567’) 请你编程找出这个长串的第n个字符。
Format
Input
第一行包含一个整数 n (1<=n<=10^9)
Output
仅一行,包含一个字符,表示这个长串的第n个字符。
Samples
输入数据 1
9
Copy
输出数据 1
2
一开始直接用字符串相加来写,不出意外,出意外了,空间上爆了,因为本题字符串的长度能到达10的9次方。
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<vector>
#include<math.h>
#include<iomanip>
#include<set>
#include<queue>
#include<stack>
#include<map>
using namespace std;
string a="4567", b="123", c;
int n;
string fun(int n)
{
while (c.size() < n)
{
c = b + a;
a = b;
b = c;
}
return c;
}
int main()
{
cin >> n;
/*while (c.size() < n)
{
c = b + a;
a = b;
b = c;
}*/
fun(n);
cout << c[n-1];
}
之后用的这种方法,应该是递归吧,但是我也没太弄明白。这样可以过
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<vector>
#include<math.h>
#include<iomanip>
#include<set>
#include<queue>
#include<stack>
#include<map>
using namespace std;
string c;
int n,a[100000];//a数组记录每次c字符串的长度
int main()
{
cin >> n;
c = "1234567"; a[0] = 4 ,a[1] = 3;//因为c由1234567这几个字符组成,a[0],a[1]就是a,b的字符数
for (int i = 2; i < 10000; i++)
{
a[i] = a[i - 1] + a[i - 2];//相当于把每次c的长度求出来
}
while (n > 7)//当长度大于7就要
{
int i = 0;
while (a[i] < n)//直到找到c的长度大于n
i++;
n = n - a[i-1];//这个地方为什么这样就能得到答案了,我也不太理解
}
cout << c[n-1];
}