Big String超级字符串

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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值