理查德·怀斯曼(Richard Wiseman)是一位心理学家,魔术师和作家,在http://richardwiseman.wordpress.com/上经营着一个小博客。他的博客谈论各种各样的事情,但是每个星期五他都会发布一个小难题,您可以尝试解决。
发布的最后一个难题谈到回文数和速度,这是完整的难题。
前几天我去骑自行车。我最喜欢的路线每米都有标志,表明您已经走了多远。我碰到标语上写着“ 15951米”,并以为“哦,这很有趣,这是一个数字回文,因为它从左到右和从右到左读相同。” 然后我骑上。两个小时后,我遇到了下一个回文数字符号。我要走多快?
我通常喜欢坐下来几分钟,仔细研究这些难题,特别是如果这些难题是基于数字的。但是,这周的困惑使我思考了可以解决问题的算法。它所需要的只是开始和结束的计数器,一个简单的回文检测器以及最后的一些数学运算以根据开始和结束值确定速度。
$start = 15951; $end = 0; for ($i = $start + 1; $i < 20000; ++$i) { if ($i == strrev($i)) { print "Palindrome = " . $i . "\n"; $end = $i; break; } } $result = $end - $start; // 锻炼速度。 print $result . ' meters, or ' . $result / 1000 . 'km, travelled in 2 hours makes the speed ' . (($result) / 2) / 1000 . ' kph';
打印出以下结果。
Palindrome = 16061 110 meters, or 0.11km, travelled in 2 hours makes the speed 0.055 kph
星期五难题的答案可以从理查德·怀斯曼(Richard Wiseman)从星期一开始的博客文章中看到。这个难题的答案是每小时55米,这与该代码创建的答案很吻合,尽管我以每小时公里数来计算。
最后,如果您查看的是字符串而不是数字,则可能需要通过删除所有标点符号和空格来稍微改进回文检测器。
$string = preg_replace( '/[^\sa-zA-Z0-9]/', '', $string); if ($string == strrev($string)) { echo 'Panindrome detected.'; }
使用该strtolower()函数来确保字符串中没有任何字符可能会导致此回文检查失败,这可能也是值得的。