c 语言 十进制四则运算,朋友,你知道回文十进制数和数列的四则运算嘛?

/* 为字符串类型添加返回逆序字符串的方法 */

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;}

0d4b0c4c17abc67ef3d230e3054dc58c.png

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")

9eb8f4b30d1ffff25d70c484d034781c.png

答案:

183fd8652e55acbd188c3b6b19d607e5.png

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,满足上述条件的数。

2573fe58ace2b5d80e290c60d11d6206.png

思路

解决这个问题时,“计算算式的方法”会影响实现方法。如果要实现的是计算器,那么通常会用到逆波兰表示法,而本题则是使用编程语言内置的功能来实现更为简单。

很多脚本语言都提供了类似 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 就是本题的关键点,接下来只是选择和设置运算符了。虽然有比较深的循环嵌套,但只要确定了位数就没有问题。

7648a43f677be058d9f24327e7f5312d.png

基于这样的考虑,如果把代码第 1 行的 op 变量设置成以下值,可以进一步提高程序执行效率。

varop = [ "*", ""];

Point

如果用其他语言实现同样逻辑,需要对 0 进行特别处理。例如在 Ruby 中,“以 0 开头的数”会被当作八进制数来处理,因此必须排除以 0 开头的数。此外,也需要排除除数为 0 的情况。

6a25e19c1a2c30860c178f1af7149993.png

答案: 5931(5 * 9 * 31= 1395)

本文摘自极客书:《程序员的算法趣题》

作者:[日] 增井敏克

《极客书》

程序员的算法趣题

内容简介

本书是一本解谜式的趣味算法书,从实际应用出发,通过趣味谜题的解谜过程,引导读者在愉悦中提升思维能力、掌握算法精髓。此外,本书作者在谜题解答上,通过算法的关键原理讲解,从思维细节入手,发掘启发性算法新解,并辅以 Ruby、Java 等不同语言编写的源代码示例,使读者在算法思维与编程实践的分合之间,切实提高编程能力。

本书适合已经学习过排序、搜索等知名算法,并想要学习更多有趣算法以提升编程技巧、拓展程序设计思路的程序员,以及对挑战算法问题感兴趣、爱好解谜的程序员阅读。

关注就给摸~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值