我有一个数组:AB AB BAB ABBAB BABABBAB ...数组的每个项的数量都基于Fibonacci数。将第n个字符串和第n + 1个字符串放在一起,然后生成第n + 2个字符串,例如.BABABBAB = BAB + ABBAB。 那么10 ^ 16的字母是A还是B?
答案 0 :(得分:3)
让f[n]
成为n
fibonacci number。
假设我们想要在通过连接x
获得的字符串中找到位置f[1], f[2], ..., f[n]
的值。
k
,f[1] + f[2] + ... + f[k] >= x
。因此,位置x
属于包含f[k]
个字符的字词(至少在它的连接中。但由于所有字词都来自a
和b
,我们将会尝试将问题简化为那两个。)x
中与f[k]
对应的位置,请从f[1] + ... + f[k - 1]
中减去x
。k = 1
打印a
,如果k = 2
打印b
,则转到第4步。f[k - 2] < x
,那么我们要查找的位置在对应于(长度)f[k - 1]
的字词中。从k
减去1,从f[k - 2]
减去x
,然后转到第3步。f[k - 2]
对应的单词中。从k
中减去2,保持x
不变,然后转到第3步。这不需要生成实际的单词,只需要它们的长度,这是基本的斐波纳契数。
工作示例 - 请注意,我只是将实际单词用于说明目的,不需要它们。
n f[n] corresponding word
1 1 a
2 1 b
3 2 ab
4 3 bab
5 5 abbab
6 8 bababbab
连接所有这些:ababbababbabbababbab
。让我们问问自己,10
的位置是什么(b
)。
1. f[1] + f[2] + f[3] + f[4] + f[5] >= 10, so k = 5
2. x = 10, f[1] + f[2] + f[3] + f[4] = 7, so subtract 7 from x, giving x = 3
3'. k isn't 1 or 2, skip this.
4'. f[k - 2 = 3] = 2 < x. k = 4, x = 1
3''. still ignoring this.
4'' f[k - 2 = 2] = 1 >= x. k = 2, x = 1
3'''. k = 2, print 'b'.
答案 1 :(得分:2)
请不要认真对待这个答案:
我从来都不是很好和数学,这听起来像这个任务应该太重,没有一个怪异的算法计算,所以我的解决方案是简单地猜测。要在A
和B
之间进行选择,我会在php中编写一个非常简单的程序来打印出前15或20行“
<?php
$var1 = "B";
$var2 = "A";
for($i=3;$i<=15;$i++){
$tmp = $var2;
$var2 = $var1;
$var1 = $tmp.$var1;
echo $i." ".$var1."<br>";
}
echo strlen(implode('',explode('B',$var1)));
echo "<br>";
echo strlen(implode('',explode('A',$var1)));
?>
结果显示,A
s(38%)总是少于B
s(62%) - 因此猜测B
的机会正确并不是那么糟糕