/* 为字符串类型添加返回逆序字符串的方法 */
String.prototype.reverse = function(){
returnthis.split( "").reverse().join( "");}
/* 从11 开始搜索 */
varnum = 11;
while( true){
if((num.toString() == num.toString().reverse()) && (num.toString( 8) == num.toString( 8).reverse()) && (num.toString( 2) == num.toString( 2).reverse())){
console.log(num);
break; }
/* 只搜索奇数,每次加2 */num += 2;}
Point
很多语言都提供了把整数转换成二进制数或者八进制数的方法。表 2 汇总了代表性语言的相关函数或者方法,不过 C 语言并没有提供直接转换的接口。
表 2 各编程语言中进制转换的接口
语言
二进制数
八进制数
十六进制数
Ruby
to_s(2)
to_s(8)
to_s(16)
PHP
decbin
decoct
dechex
Python
bin
oct
hex
Java
toString(2)
toString(8)
toString(16)
Java
toBinaryString
toOctalString
toHexString
C#
Convert.ToString
Convert.ToString
Convert.ToString 或者 ToString("X")
答案:
Q2 数列的四则运算
IQ:70 目标时间:10 分钟
大家小时候可能也玩过“组合车牌号里的 4 个数字最终得到 10”的游戏。
组合的方法是在各个数字之间插入四则运算的运算符组成算式,然后计算算式的结果(某些数位之间可以没有运算符,但最少要插入 1 个运算符)。
例)
1234 → 1 + 2×3 - 4 = 3
9876 → 9×87 + 6 = 789
假设这里的条件是,组合算式的计算结果为“将原数字各个数位上的数逆序排列得到的数”,并且算式的运算按照四则运算的顺序进行(先乘除,后加减)。
那么位于 100~999,符合条件的有以下几种情况。
351-→-3×51 = 153
621-→-6×21 = 126
886-→-8×86 = 688
问题
求位于 1000~9999,满足上述条件的数。
思路
解决这个问题时,“计算算式的方法”会影响实现方法。如果要实现的是计算器,那么通常会用到逆波兰表示法,而本题则是使用编程语言内置的功能来实现更为简单。
很多脚本语言都提供了类似 eval 这样的标准函数。譬如用 Java 实现时,可以用代码清单 02.01 解决问题。
代码清单02.01(q02_01.js)varop = [ "+", "-", "*", "/", ""];
for(i = 1000; i < 10000; i++){
varc = String(i);
for(j = 0; j < op.length; j++){
for(k = 0; k < op.length; k++){
for(l = 0; l < op.length; l++){ val = c.charAt( 3) + op[j] + c.charAt( 2) + op[k] + c.charAt( 1) + op[l] + c.charAt( 0);
if(val.length > 4){ /* 一定要插入1 个运算符 */if(i == eval(val)){
console.log(val + " = "+ i); } } } } }}
第 10 行中的 eval 就是本题的关键点,接下来只是选择和设置运算符了。虽然有比较深的循环嵌套,但只要确定了位数就没有问题。
基于这样的考虑,如果把代码第 1 行的 op 变量设置成以下值,可以进一步提高程序执行效率。
varop = [ "*", ""];
Point
如果用其他语言实现同样逻辑,需要对 0 进行特别处理。例如在 Ruby 中,“以 0 开头的数”会被当作八进制数来处理,因此必须排除以 0 开头的数。此外,也需要排除除数为 0 的情况。
答案: 5931(5 * 9 * 31= 1395)
本文摘自极客书:《程序员的算法趣题》
作者:[日] 增井敏克
《极客书》
程序员的算法趣题
内容简介
本书是一本解谜式的趣味算法书,从实际应用出发,通过趣味谜题的解谜过程,引导读者在愉悦中提升思维能力、掌握算法精髓。此外,本书作者在谜题解答上,通过算法的关键原理讲解,从思维细节入手,发掘启发性算法新解,并辅以 Ruby、Java 等不同语言编写的源代码示例,使读者在算法思维与编程实践的分合之间,切实提高编程能力。
本书适合已经学习过排序、搜索等知名算法,并想要学习更多有趣算法以提升编程技巧、拓展程序设计思路的程序员,以及对挑战算法问题感兴趣、爱好解谜的程序员阅读。
关注就给摸~