`

怎样不用中间变量temp 实现两个数交换

 
阅读更多
<wbr><p><span style="font-size:18px"><strong>第一类方法也是常用的方法,通过多次的数值计算来完成交换,到现在知道的有下面三种:</strong></span></p> <p><span style="font-size:18px"><strong>(1)加减法。</strong></span></p> <p><span style="font-size:18px"><strong>a = a + b;</strong></span></p> <p><span style="font-size:18px"><strong>b = a - b;</strong></span></p> <p><span style="font-size:18px"><strong>a = a - b;</strong></span></p> <p><span style="font-size:18px"><strong>该方法可以交换整型和浮点型数值的变量,但在处理浮点型的时候有可能出现精度的损失,例如对数据:</strong></span></p> <p><span style="font-size:18px"><strong>a = 3.123456</strong></span></p> <p><span style="font-size:18px"><strong>b = 1234567.000000</strong></span></p> <p><span style="font-size:18px"><strong>交换后各变量值变为:</strong></span></p> <p><span style="font-size:18px"><strong>a = 1234567.000000</strong></span></p> <p><span style="font-size:18px"><strong>b = 3.125000</strong></span></p> <p><span style="font-size:18px"><strong>很明显,原来a的值在交换给b的过程中发生了精度损失。</strong></span></p> <p><span style="font-size:18px"><strong>(2)乘除法。</strong></span></p> <p><span style="font-size:18px"><strong>a = a * b;</strong></span></p> <p><span style="font-size:18px"><strong>b = a / b;</strong></span></p> <p><span style="font-size:18px"><strong>a = a / b;</strong></span></p> <p><span style="font-size:18px"><strong>乘除法更像是加减法向乘除运算的映射,它与加减法类似:可以处理整型和浮点型变量,但在处理浮点型变量时也存在精度损失问题。而且乘除法比加减法要多一条约束:b必不为0。</strong></span></p> <p><span style="font-size:18px"><strong>可能经验上的某种直觉告诉我们:加减法和乘除法可能会溢出,而且乘除的溢出会特别严重。其实不然,采用这两种方法都不会溢出。以加减法为例,第一步的加运算可能会造成溢出,但它所造成的溢出会在后边的减运算中被溢出回来。</strong></span></p> <p><span style="font-size:18px"><strong>(3)异或法。</strong></span></p> <p><span style="font-size:18px"><strong>a ^= b;//a=a^b</strong></span></p> <p><span style="font-size:18px"><strong>b ^= a;//b=b^(a^b)=b^a^b=b^b^a=0^a=a</strong></span></p> <p><span style="font-size:18px"><strong>a ^= b;//a=(a^b)^a=a^b^a=a^a^b=0^b=b</strong></span></p> <p><span style="font-size:18px"><strong>异或法可以完成对整型变量的交换,对于浮点型变量它无法完成交换。</strong></span></p> <p><span style="font-size:18px"><strong>第二类方法更像是玩了一个文字游戏,此种方法采用了在代码中嵌入汇编代码的方法避免了临时变量的引入,但究其本质还是会使用额外的存储空间。此种方法可以有很多种,下边列出几种:</strong></span></p> <p><span style="font-size:18px"><strong></strong></span></p> <p><span style="font-size:18px"><strong>(1)使用xchg指令,这也是比较直观、容易想到的方法,因为xchg指令的功能就是交换源操作数和目的操作数的值,这里要使用额外寄存器来暂存变量。内嵌汇编代码如下:</strong></span></p> <p><span style="font-size:18px"><strong>_asm</strong></span></p> <p><span style="font-size:18px"><strong>{</strong></span></p> <p><span style="font-size:18px"><strong>mov eax,a</strong></span></p> <p><span style="font-size:18px"><strong>xchg b,eax</strong></span></p> <p><span style="font-size:18px"><strong>mov a,eax</strong></span></p> <p><span style="font-size:18px"><strong>}</strong></span></p> <p><span style="font-size:18px"><strong>(2)使用额外的栈。这里使用反向的出栈顺序来完成交换。内嵌代码有如下两种形式:</strong></span></p> <p><span style="font-size:18px"><strong>_asm</strong></span></p> <p><span style="font-size:18px"><strong>{</strong></span></p> <p><span style="font-size:18px"><strong>push a</strong></span></p> <p><span style="font-size:18px"><strong>push b</strong></span></p> <p><span style="font-size:18px"><strong>pop a</strong></span></p> <p><span style="font-size:18px"><strong>pop b</strong></span></p> <p><span style="font-size:18px"><strong>}</strong></span></p> <p><span style="font-size:18px"><strong>另一种形式:</strong></span></p> <p><span style="font-size:18px"><strong>_asm push a</strong></span></p> <p><span style="font-size:18px"><strong>a = b;</strong></span></p> <p><span style="font-size:18px"><strong>_asm pop a</strong></span></p> <p><span style="font-size:18px"><strong>(3)使用mov指令。这种方法使用额外寄存器来暂存一个变量的值。</strong></span></p> <p><span style="font-size:18px"><strong>_asm mov eax,a</strong></span></p> <p><span style="font-size:18px"><strong>a = b;</strong></span></p> <p><span style="font-size:18px"><strong>_asm mov b,eax</strong></span></p> <p><span style="font-size:18px"><strong>其实第二类方法并不合格,它虽然没有显式的使用临时变量,但还是会用到额外的存贮空间。不过也不能说没有必要掌握,从实用的角度看还是很“有用”的。不是有公司出过这样的面试题吗?“不使用加减法和异或法完成不使用中间变量交换两个数值型变量的值”。此时或许只好使用这种方法了。</strong></span></p> <wbr><br></wbr></wbr>
分享到:
评论

相关推荐

    JS实现不用中间变量temp 实现两个变量值得交换方法

    总结来说,在JavaScript中实现两个变量值的交换,不必依赖中间变量temp,我们有多种方法可以选择。包括使用加减法、乘除法,以及利用数组的灵活性。每种方法有其适用场景和潜在的限制。在实际开发中,可以根据变量的...

    用C#语言实现两个数的交换

    在C#编程中,交换两个变量的值是一个常见的操作,比如在数组排序、数学计算或者数据处理场景。这里我们将详细探讨如何用C#语言实现这个功能。首先,我们需要理解基本的赋值运算符以及理解临时变量的作用。 1. **...

    c代码-2.功能:不用第三个变量,实现两个数的对调操作。

    以上就是关于在C语言中如何不使用第三个变量实现两个数对调的操作。这种方法展示了C语言的灵活性和算术运算的巧妙应用。在学习和实践编程时,理解这些底层机制能够帮助我们更好地编写高效且优雅的代码。

    将两个数字交换位置,C#的实现源程序

    在C#编程中,交换两个数字的位置是一个常见的操作,它涉及到基本的数据类型处理和变量赋值。本示例中,我们将探讨如何在C#中实现这个功能,以及在这个过程中可能遇到的一些关键点。 首先,我们要了解C#中的基本数据...

    不用第三方变量交换两数的值

    在编程中,交换两个数值是常见的操作,但有时我们可能会面临一种情况,即不允许使用额外的(第三方)变量来辅助交换。这个问题在各种编程语言中都有不同的解决方案,下面我们将详细探讨几种主流的方法。 首先,我们...

    不要采用异或来交换两个变量

    在编程领域,尤其是在学习基本算法和数据结构的过程中,我们经常遇到如何交换两个变量值的问题。通常,教科书中会介绍几种方法,其中一种就是利用异或(XOR)操作来实现变量交换。然而,这种做法是否真的有效?本文...

    两个数据的交换

    在计算机编程领域,数据交换(或称值交换)是指将两个变量中的值进行互换的过程。这是编程中最基本的操作之一,在多种场景下都有应用,比如排序算法、数组元素位置调整等。 ### 常用的数据交换算法 #### 经典算法...

    第8章 指针-2指针变量作函数参数 - 典型实例 - 两数交换new1

    本章主要探讨了指针作为函数参数的用法,特别是通过指针实现两个数值的交换。下面我们将详细讨论这个主题。 首先,我们来看一个简单的两数互换的例子,这里涉及到两种不同的函数调用方式:按值传递(Call by Value...

    输入两个数.docx

    在这个方法中,我们可以使用一个中间变量来实现两个数的交换。例如: ```c int a, b; int c; printf("please enter two integer numbers:"); scanf("%d %d", &a, &b); printf("a=%d b=%d\n", a, b); if (a ) { c = ...

    swapping:matlab中两个数的交换-matlab开发

    在 MATLAB 开发中,"swapping" 是一个常见的操作,特别是在处理数组或变量时,我们可能需要交换两个数值的位置。MATLAB 是一种高级的矩阵和数组编程语言,它提供了丰富的数学函数库和直观的交互环境,使得这类操作变...

    Java 程序交换两个数字.docx

    Java 程序交换两个数字的方法主要有三种:使用第三个变量、不使用额外变量以及使用异或操作。下面分别详细介绍这三种方法。 1. 使用第三个变量交换值 这种方法是最直观的,也是大多数初学者首选的方式。它涉及到...

    新建 360压缩 ZIP 文件 (4).zip_1382_tow_1382.tow_两个数的交换

    标题中的“新建 360压缩 ZIP 文件 (4).zip_1382_tow_1382.tow_两个数的交换”表明这是一个关于使用360压缩软件创建的ZIP文件,其中包含了与问题编号1382相关的解决策略,特别是涉及到“tow”(可能是“two”的误拼)...

    python数字金字塔-31-交换变量的值之方法二.ev4.rar

    在Python编程语言中,交换两个变量的值是一个常见的操作,特别是在处理数据或执行算法时。在本主题"python数字金字塔-31-交换变量的值之方法二"中,我们将探讨除了传统的方法(如使用临时变量)之外的另一种方法来...

    最简单的交换两个整数算法

    然而,有一种巧妙的方法可以实现两个整数的交换,而无需使用额外的中间变量,这就是通过位运算来完成。这种方法对于节省内存资源和提高程序效率具有一定的价值,特别是在嵌入式系统或内存受限的环境中。 首先,我们...

    函数交换与宏交换的区别

    通过对比函数交换和宏交换的运行结果,我们可以看到,正确实现的函数交换和宏交换都能满足题目的要求,即在输入两个数后,根据它们的大小关系调整顺序,确保大数先输出。但是,错误的函数交换实现(即只交换指针而未...

    单片机C51-绝对地址访问 两数交换 3种方法

    声明一个临时变量temp,将a的值存储到temp中,然后将b的值赋给a,最后将temp中的值赋给b。这种方法简单明了,但多了一个额外的存储空间需求。 ```c int temp; temp = a; a = b; b = temp; ``` 2. 异或操作:这种...

    思维挑战1:交换变量中的数.zip

    我们可以创建一个新的临时变量temp,将a的值暂存到temp中,然后将b的值赋给a,最后将temp中的值(原本a的值)赋给b。这样,a和b的值就成功互换了。代码如下: ```c #include int main() { int a = 5, b = 10; ...

    自定义泛型实现元素交换

    以上`Swap`方法接收两个索引,检查它们是否在合法范围内,然后使用一个临时变量来交换两个位置的元素。这个方法适用于任何实现了`IComparable&lt;T&gt;`接口的类型,但请注意,如果`T`不支持比较,编译器可能不会发出警告...

Global site tag (gtag.js) - Google Analytics