传送门:
//------------------------------------题目内容--------------------------------------
9269:Big String超级字符串
总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 131072kB
描述
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个字符。
---------
输入
第一行包含一个整数 n (1<=n<=10^9)
---------
输出
仅一行,包含一个字符,表示这个长串的第n个字符。
---------
样例输入
9
样例输出
2
//----------------------------------------解题-----------------------------------------
先来观察一下a,b,c的长度变化:
可以发现嘛,这个字符串的构成只有1,2,3,4,5,6,7这几个字符,
而且4,5,6,7只会属于‘4567’,而1,2,3只会属于‘123’,
然后呢,但操作次数为单数时,字符串【c】末段一定是‘4567’【长度为4】
但操作次数为偶数时,字符串【c】末段一定是‘123’【长度为3】
--------------------------------------------
思路:
可以用递归查找那个要找的那个字符在123或4567中的第几位,找到后输出就可以啦
代码:
1 program chaojizifuchuan; 2 var 3 n,tochange,tcd:longint; 4 //----------------------------------------------------------------------------- 5 function need(t1:longint):longint;//需要进行几步操作 6 var 7 sum,xh,sum2,su:longint; 8 begin 9 xh:=2; //默认需要两步10 sum:=7; //xh-1步的字符串长度11 sum2:=10; //xh步的字符串长度12 while sum2=total-last then begin //如果在字符串末段47 if last=4 then c:='4567'48 else c:='123'; //last记录的是末段的长度嘛49 printf(c[len-total+last]); //输出50 end51 else begin52 dec(bu); //这个似乎可以删掉QAQ53 total:=tcd; //上一步长度54 tcd:=0; //还原tcd55 try(len-total);//继续try那个lastend到len段【其长度就是len减去上一步的长度】56 end;57 end;58 59 end;60 //-----------------------------------------------------------------------------61 begin62 readln(n); //读入63 try(n); //try64 end.
//中秋快乐QAQ ----于2016.9.15