题目:写一个函数,求两个整数的之和,要求在函数体内不得使用+、-、×、÷。
分析:这又是一道考察发散思维的很有意思的题目。当我们习以为常的东西被限制使用的时候,如何突破常规去思考,就是解决这个问题的关键所在。
看到的这个题目,我的第一反应是傻眼了,四则运算都不能用,那还能用什么啊?可是问题总是要解决的,只能打开思路去思考各种可能性。首先我们可以分析人们是如何做十进制的加法的,比如是如何得出5+17=22这个结果的。实际上,我们可以分成三步的:第一步只做各位相加不进位,此时相加的结果是12(个位数5和7相加不要进位是2,十位数0和1相加结果是1);第二步做进位,5+7中有进位,进位的值是10;第三步把前面两个结果加起来,12+10的结果是22,刚好5+17=22。
前面我们就在想,求两数之和四则运算都不能用,那还能用什么啊?对呀,还能用什么呢?对数字做运算,除了四则运算之外,也就只剩下位运算了。位运算是针对二进制的,我们也就以二进制再来分析一下前面的三步走策略对二进制是不是也管用。
5的二进制是101,17的二进制10001。还是试着把计算分成三步:第一步各位相加但不计进位,得到的结果是10100(最后一位两个数都是1,相加的结果是二进制的10。这一步不计进位,因此结果仍然是0);第二步记下进位。在这个例子中只在最后一位相加时产生一个进位,结果是二进制的10;第三步把前两步的结果相加,得到的结果是10110,正好是22。由此可见三步走的策略对二进制也是管用的。
接下来我们试着把二进制上的加法用位运算来替代。第一步不考虑进位,对每一位相加。0加0与1加1的结果都0,0加1与1加0的结果都是1。我们可以注意到,这和异或的结果是一样的。对异或而言,0和0、1和1异或的结果是0,而0和1、1和0的异或结果是1。接着考虑第二步进位,对0加0、0加1、1加0而言,都不会产生进位,只有1加1时,会向前产生一个进位。此时我们可以想象成是两个数先做位与运算,然后再向左移动一位。只有两个数都是1的时候,位与得到的结果是1,其余都是0。第三步把前两个步骤的结果相加。如果我们定义一个函数AddWithoutArithmetic,第三步就相当于输入前两步骤的结果来递归调用自己。
有了这些分析之后,就不难写出如下的代码了:
转自:
http://zhedahht.blog.163.com/blog/static/254111742011125100605/
分享到:
相关推荐
首先我们可以分析人们是如何做十进制的加法的,比如是如何得出5+17=22这个结果的。实际上,我们可以分成三步的:第一步只做各位相加不进位,此时相加的结果是12(个位数5和7相加不要进位是2,十位数0和1相加结果是1...
- 简单的计算器通常需要处理四种基本运算符:加法(+),减法(-),乘法(*)和除法(/)。 - 可以通过字符串查找或正则表达式来识别操作符。 3. **算术运算**: - 使用条件语句(如`if...else`)或者switch...
根据给定文件信息,本知识点将详细解释如何在***这些数字序列中插入加号(+)、减号(-)、乘号(*)、除号(/)运算符,使得最终的算术表达式计算结果等于100,并且提供使用Go语言实现这一问题的解决方案和相关算法...
2. 二元运算符:包括加法运算符+、减法运算符-、乘法运算符*、除法运算符/等,操作数为两个。 3. 比较运算符:包括等于运算符==、不等于运算符!=、大于运算符>等,用于比较两个表达式的值。 4. 规律运算符:包括按位...
例如,我们可以定义一个名为Calculator的类,其中包含两个操作数和一个运算符,然后重载"+","-","*"和"/"运算符来执行相应的计算。 对于平方、开方和三角函数等功能,我们可以利用C++标准库中的cmath头文件。...
加法运算符> ::= +|- 乘法运算符> ::= * |/ 关系运算符> ::= ||>|>=|!=|== 字符> ::= _|a|...|z|A|...|Z 数字> ::= 0|非零数字> 非零数字> ::= 1|...|9 字符串> ::=...
加法运算符> ::= +|- 乘法运算符> ::= * |/ 关系运算符> ::= ||>|>=|!=|== 字符> ::= _|a|...|z|A|...|Z 数字> ::= 0|非零数字> 非零数字> ::= 1|...|9 字符串> ::=...
运算符重载的实现是通过重载运算符的方式来实现的,例如重载“+”和“-”运算符来完成加法和减法运算。 在运算符重载中,需要注意运算符的优先级和结合性,以避免运算符的歧义。 类型转换函数是C++语言中的一种...
这些运算符可以用来操作数字、变量和表达式,生成新的值或结果。 一、算术运算符的分类 * 加法运算符:+ * 减法运算符:- * 乘法运算符:* * 除法运算符:/ * 取整运算符:// * 取模运算符:% * 幂运算符: 二、...
总结来说,“简单计算器(+-*/得)”是一个基础的编程练习,涵盖了变量、运算符、输入输出、错误处理、用户界面设计和程序打包等多个关键的编程和软件工程概念。无论是初学者还是有经验的开发者,这样的项目都是巩固...
例如,算术运算符的优先级通常高于赋值运算符,这意味着 `5 + 2 * 3` 先进行乘法运算,然后再做加法。了解运算符的优先级对于编写正确无误的代码至关重要。 比较运算的结果只可能是真(TRUE)或假(FALSE),这在...
### C语言用数组实现求素数,并且运算过程仅使用+-法 #### 概述 在计算机科学领域,素数的检测与生成是一项常见的任务,尤其是在加密算法、数学建模等场景中。本文将详细解释如何使用C语言通过数组来找出一定范围...
在C语言中,有时我们可能面临一种特殊挑战:在不使用基本的加法(+)、减法(-)、乘法(×)、除法(÷)运算符的情况下求两个整数的和。这个问题主要考验程序员的逻辑思维和对位运算的理解。下面我们将详细探讨...
在Swift中,基本运算符分为几大类:算术运算符、比较运算符、逻辑运算符、位运算符以及赋值运算符。我们一一来探讨: 1. **算术运算符**: - 加法(`+`):用于数字的相加。 - 减法(`-`):用于数字的相减。 - 乘法...
为了保证程序的健壮性,需要对用户输入进行验证,确保输入的是有效的数字和运算符,避免程序因无效输入而崩溃。 9. **设计模式**: 虽然这是一个简单的项目,但也可以采用命令模式(Command Pattern)来设计,将...
运算符则是用来操作这些变量的工具,如加法、减法、乘法、除法以及比较和逻辑运算。在进制转换中,我们可能使用到的运算符主要是算术运算符,例如加(+)和乘(*),以及位运算符,如按位与(&)、按位或(|)、按位...
在Java中,`+`用于加法,`-`用于减法,`*`用于乘法,`/`用于除法,而`()`则用于括号,以改变运算顺序。在四则混合运算中,括号有着最高的优先级,它们可以确保先进行括号内的运算。例如,表达式`2 + 3 * 4`如果没有...
通常,"+"用于数字的加法,但在类的上下文中,我们可以重载它来实现自定义的行为。例如,如果我们有一个表示线段或边长的类,重载"+"可以使我们能够轻松地将两个线段相加,得到一个新的线段。在这个项目中,重载的"+...
在C++编程语言中,这些题目涉及了多个核心概念,包括基本运算、数据结构、类的设计、运算符重载以及算法应用。以下是针对每个知识点的详细说明: 1. **a方+b方**: 这可能是一个基础数学问题,要求计算两个数的平方...
在本文中,我们将深入探讨如何使用C语言编写一个简单的命令行计算器程序,该程序支持基本的数学运算,包括加法(+)、减法(-)、乘法(×)、除法(/)以及括号(())的使用来改变运算优先级。C语言是一种广泛...