Tom 发现了一种神奇的字符串 - 斐波那契字符串 , 定义 f[1]=0,f[2]=1, 对于所有的 i>2 都有f[i]=f[i-2]+f[i-1],其中“+”代表拼接,比如01+10=0110,现在对于字符串 f[n],请判断 f[n] 的第 k 项是 0,还是 1。输入两个数字 n 和 k(n<=300,k<=1000000000)。输出 f[n] 的第k位,如果k大于f[n]的位数,则输出-1。
这个问题可以使用递归的方法来求解。 题目中给出了字符串拼接的规律:f[i]=f[i-2]+f[i-1]。可以看出对于第 i 个字符串, 它的前半部分属于第 i-2 个字符串,后半部分属于第 i-1 个字符串。 这样,当给定具体的n和k时,我们可以首先判断k位于第n个字符串的前半 部分还是后半部分,然后递归的把 k 传递给第 n-2 或 n-1 个字符串。 计算过程: 1. 为了判断属于前半部分还是后半部分,需要计算每一个字符串的长度。 一个 len 数组。每个位置为对应字符串的长度。 len[1]=len[2]=1; len[i]=len[i-2]+len[i-1]; 1.如果 k >len[n],则输出 -1。 2.设置递归函数intfind(int i,int k); 这个函数返回第 i 个字符串中 k 个位置的字符 3.判断 k 在前半部分还是后半部分。 a)K<=len[i-2] 前半部分,调用 find(i-2,k) b)K>len[i-2] 后半部分,调用 find(i-1,k-len[i-2]) 上面的计算在第一步时会遇到问题,当n大于几十的时候,len 就会超出 int 的范围。对这个问题的解决基于对递归过程的观察,第4步a)中k始终是不变的,i的奇偶性也保持不变。所以在计算第1步len时可以提前停止,当发现len[i]>=k且i与 n 的奇偶性相同时。第 4 步中的递归起始也可以使用第 i 个字符串开始,而不是第n 个。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。