精华内容
下载资源
问答
  • 2017-12-22 23:01:01

    题目如标题所述。

    分析

    采用位运算,这样的代码指令和利用临时变量一样多,但是位运算明显比赋值略微复杂一点点。毕竟赋值不需要经过计算。

    代码

        def exchage_nums(a, b):
            '''
                不用额外变量交换两个整数值,空间节省了,时间负责度略高一些。
            '''
            a = a ^ b
            b = a ^ b
            a = a ^ b
            return a, b
    更多相关内容
  • 在程序中实现交换两个数的功能并不复杂,但如果不使用中间变量,需要动一下脑筋。在本文介绍了两个方法(其实原理都是一个)。其基本原理是数的中和。也是说,通过某种运算(二元运算)将a和b两个数变成一个数,并...
  • 以前闲聊的时候朋友说有一种方法,需要中间变量,就可以将两个变量的内容交换
  • 群中的题目,不过这样大众脸的题想必大家都见过,就看能玩出什么新花招
  • 下面小编就为大家带来一篇Java 交换两个变量的数值实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • c#中实现两个int变量的数值互换,在借助第三个变量做临时载体的情况下,非常简单。  int a = 10;  int b = 5;  int c ;  c = a;  a = b;  b = c;  如果借助第三方变量,有几种实现的方法:  1....
  • 在进行开发时,往往需要对两个整数变量进行交换,可采用以下三种方法:1、借助临时变量;public static void swap1(int a,intb ){System.out.println("原始值:"+a+","+b);int temp =a ;a=b;b=temp;System.out....

    在进行开发时,往往需要对两个整数变量进行交换,可采用以下三种方法:

    1、借助临时变量;

    public static void swap1(int a,intb ){

    System.out.println("原始值:"+a+","+b);int temp =a ;

    a=b;

    b=temp;

    System.out.println("交换后:"+a+","+b);

    }

    此种方式比较好理解,在开发时可直接使用。但在面试中使用,似乎显得低端。

    2、借助“先加后减”操作,不生成临时变量。

    1 public static voidswap3(){2 int a=Integer.MAX_VALUE;3 int b = Integer.MAX_VALUE-1;4 System.out.println("原始值:"+a+","+b);5 a =a+b;6 b= a-b;7 a =a-b;8 System.out.println("交换后:"+a+","+b);9 }

    使用此种方法时,注意加减的次序。

    另外一点,有人说在使用这种方法时需要注意数值越界的问题。为验证此问题,将a和b的值都是设为整型最大值,结果仍无误,此说法似乎有误。

    3、借助异或

    public static void swap2 (int a ,intb){

    System.out.println("原始值:"+a+","+b);

    a= a^b;

    b= b^a;

    a= a^b;

    System.out.println("交换后:"+a+","+b);

    }

    其实现原理是进行异或操作的数学性质。如下

    1.任一变量X与其自身进行异或结果为0,即 X^X=0

    2.任一变量X与0进行异或结果不变,即 X^0=X

    3.异或运算具有可结合性,即 a^b^c = (a^b)^c = a^(b^c)

    4.异或运算具有可交换性,即 a^b = b^a。

    在异或性质的基础之前进行操作,实现交换的执行过程为:

    a = a ^ b   ==>   a = a ^ b;//获得异或值,赋值给a

    b = a ^ b   ==>   (a ^ b) ^ b = a ^ (b ^ b) = a ^ 0 = a,//将上一步异或后的a带入,获得b

    a=  a ^ b   ==>   (a ^ b) ^ b =  (a ^ b) ^ a = a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b, 该值赋值给a,即 a = b

    展开全文
  • 大部分语言,例如c语言,交换两个变量的值需要使用中间变量。 例如交换a,b 伪代码: tmp = a a = b b = tmp python里面可以实现无临时变量的交换 (a,b) = (b,a) 对于它的交换原理我深感好奇,因为这意味着python...
  • 主要介绍了在JS中 实现不用中间变量temp 实现两个变量值得交换 ,需要的朋友可以参考下
  • #include<stdio.h> int main() { int a=1; int b=2; printf("交换前:a=%d,b=%...//a变为项之和,b没变 b=a-b;//b得到原来的a a=a-b;//a得到原来的b printf("交换后:a=%d,b=%d",a,b); return 0; }

    1.通过两变量之间相加减交换值。(如果int值过大,可能存在溢出问题)

    #include<stdio.h>
    int main()
    { 
    	int a=1;
    	int b=2;
    	printf("交换前:a=%d,b=%d\n",a,b);
    	a=a+b;//a变为两项之和,b没变
    	b=a-b;//b得到原来的a 
    	a=a-b;//a得到原来的b 
    	printf("交换后:a=%d,b=%d",a,b);
    	return 0;
    }

    2.通过位异或(^)办法交换值。(不会溢出)

    ^ ——按(二进制)位异或,相同为0,不同为1。(异或异为真)

    二进制中a=01,b=10,每位进行异或比较,得到结果。

    #include<stdio.h>
    int main()
    { 
    	int a=1;//a=01
    	int b=2;//b=10
    	printf("交换前:a=%d,b=%d\n",a,b);
    	a=a^b;//a=11
    	b=a^b;//b=01
    	a=a^b;//a=10
    	printf("交换后:a=%d,b=%d",a,b);
    	return 0;
    }

    一般情况下会使用第三个变量的方法交换两变量的值,代码可读性高,执行效率高;异或操作可读性差,执行效率低于其他方法!

    展开全文
  • 两个整数通过函数调用交换其值,然后输出。首先定义一个函数,3个值交换。在主函数函数声明(可省略),调用函数,输入要交换的两个值
  • 交换两个变量的值,不使用第三个变量的四种法方

    千次阅读 多人点赞 2019-09-13 18:42:27
    交换两个变量的值,不使用第三个变量的四种法方 通常我们的做法是(尤其是在学习阶段):定义一个新的变量,借助它完成交换。代码如下: int a,b; a=10; b=15; int t; t=a; a=b; b=t; 这种算法易于理解,特别适合...

    交换两个变量的值,不使用第三个变量的四种法方

    通常我们的做法是(尤其是在学习阶段):定义一个新的变量,借助它完成交换。代码如下:
    int a,b;
    a=10; b=15;
    int t;
    t=a; a=b; b=t;
    这种算法易于理解,特别适合帮助初学者了解计算机程序的特点,是赋值语句的经典应用。在实际软件开发当中,此算法简单明了,不会产生歧义,便于程序员之间的交流,一般情况下碰到交换变量值的问题,都应采用此算法(以下称为标准算法)。

    上面的算法最大的缺点就是需要借助一个临时变量。那么不借助临时变量可以实现交换吗?答案是肯定的!这里我们可以用三种算法来实现:1)算术运算;2)指针地址操作;3)位运算;4)栈实现。

    1) 算术运算
    int a,b;
    a=10;b=12;
    a=b-a; //a=2;b=12
    b=b-a; //a=2;b=10
    a=b+a; //a=10;b=10
    它的原理是:把a、b看做数轴上的点,围绕两点间的距离来进行计算。
    具体过程:第一句“a=b-a”求出ab两点的距离,并且将其保存在a中;第二句“b=b-a”求出a到原点的距离(b到原点的距离与ab两点距离之差),并且将其保存在b中;第三句“a=b+a”求出b到原点的距离(a到原点距离与ab两点距离之和),并且将其保存在a中。完成交换。
    此算法与标准算法相比,多了三个计算的过程,但是没有借助临时变量。(以下称为算术算法)
    缺点:是只能用于数字类型,字符串之类的就不可以了。a+b有可能溢出(超出int的范围),溢出是相对的, +了溢出了,-回来不就好了,所以溢出不溢出没关系,就是不安全。

    2) 指针地址操作
    因为对地址的操作实际上进行的是整数运算,比如:两个地址相减得到一个整数,表示两个变量在内存中的储存位置隔了多少个字节;地址和一个整数相加即“a+10”表示以a为基地址的在a后10个a类数据单元的地址。所以理论上可以通过和算术算法类似的运算来完成地址的交换,从而达到交换变量的目的。即:
    int a,b; //假设
    a=new int(10);
    b=new int(20); //&a=0x00001000h,&b=0x00001200h
    a=(int
    )(b-a); //&a=0x00000200h,&b=0x00001200h
    b=(int
    )(b-a); //&a=0x00000200h,&b=0x00001000h
    a=(int
    )(b+int(a)); //&a=0x00001200h,&b=0x00001000h
    通过以上运算a、b的地址真的已经完成了交换,且a指向了原先b指向的值,b指向原先a指向的值了吗?上面的代码可以通过编译,但是执行结果却令人匪夷所思!原因何在?
    首先必须了解,操作系统把内存分为几个区域:系统代码/数据区、应用程序代码/数据区、堆栈区、全局数据区等等。在编译源程序时,常量、全局变量等都放入全局数据区,局部变量、动态变量则放入堆栈区。这样当算法执行到“a=(int
    )(b-a)”时,a的值并不是0x00000200h,而是要加上变量a所在内存区的基地址,实际的结果是:0x008f0200h,其中0x008f即为基地址,0200即为a在该内存区的位移。它是由编译器自动添加的。因此导致以后的地址计算均不正确,使得a,b指向所在区的其他内存单元。再次,地址运算不能出现负数,即当a的地址大于b的地址时,b-a<0,系统自动采用补码的形式表示负的位移,由此会产生错误,导致与前面同样的结果。
    有办法解决吗?当然!以下是改进的算法:
    if(a<b)
    {
    a=(int*)(b-a);
    b=(int*)(b-(int(a)&0x0000ffff));
    a=(int*)(b+(int(a)&0x0000ffff));
    }
    else
    {
    b=(int*)(a-b);
    a=(int*)(a-(int(b)&0x0000ffff));
    b=(int*)(a+(int(b)&0x0000ffff));
    }
    算法做的最大改进就是采用位运算中的与运算“int(a)&0x0000ffff”,因为地址中高16位为段地址,后16位为位移地址,将它和0x0000ffff进行与运算后,段地址被屏蔽,只保留位移地址。这样就原始算法吻合,从而得到正确的结果。
    此算法同样没有使用第三变量就完成了值的交换,与算术算法比较它显得不好理解,但是它有它的优点即在交换很大的数据类型时,它的执行速度比算术算法快。因为它交换的时地址,而变量值在内存中是没有移动过的。(以下称为地址算法)

    3) 位运算
    int a=10,b=12; //a=1010^b=1100;
    a=a^b; //a=0110^b=1100;
    b=a^b; //a=0110^b=1010;
    a=a^b; //a=1100=12;b=1010;
    此算法能够实现是由异或运算的特点决定的,通过异或运算能够使数据中的某些位翻转,其他位不变。这就意味着任意一个数与任意一个给定的值连续异或两次,值不变。

    4)栈实现。不多解释了,栈和相关函数定义省去。
    int exchange(int x,int y)
    {
    stack S;
    push(S,x);
    push(S,y);
    x=pop(S);
    y=pop(S);
    }

    以上算法均实现了不借助其他变量来完成两个变量值的交换,相比较而言算术算法和位算法计算量相当,地址算法中计算较复杂,却可以很轻松的实现大类型(比如自定义的类或结构)的交换,而前两种只能进行整形数据的交换(理论上重载“^”运算符,也可以实现任意结构的交换)。
    介绍这三种算法并不是要应用到实践当中,而是为了探讨技术,展示程序设计的魅力。从中可以看出,数学中的小技巧对程序设计而言具有相当的影响力,运用得当会有意想不到的神奇效果。而从实际的软件开发看,标准算法无疑是最好的,能够解决任意类型的交换问题。

    展开全文
  • #includevoidswap(int*p,int*p2);/*propotypesdeclaration*/voidmain(){inta1,a2,*ptr1,*ptr2;printf("Entertwointeger(separatebycommas):\n");scanf("%d,%d",&a1,&a2);/*entera1anda...
  • 交换变量的值这可能是很多人不屑一顾的哦 但不同语言方式不同哦 例如我开始学的是C,JAVA 语言的,特别的麻烦哦 例如 方式一: int a = 5; int b = 8; a = a ^ b; b = a ^ b; a = a ^ b; 优点:需要创建第三...
  • 以下是将两个数值进行交换的三种方法 #include<bits/stdc++.h> using namespace std; void swap1(int &a,int &b) { a = a + b; b = a - b; a = a - b; } void swap2(int &a,int &b) { a =...
  • 如何使用指针形参交换两个整数的值(详解)

    万次阅读 多人点赞 2018-07-14 11:27:31
    这是因为在swap函数体内部,只是交换两个形参指针本身的值,未能影响实参。这时候如果在形参里面也有一条打印语句的话,能够清晰的看到在被调函数里面,确实交换了指针的值,但是这只在局部范围内有效,调用完毕...
  • 借助第三个变量交换两个整数

    千次阅读 2016-08-06 21:40:06
    假设两个数x和y,则有: 方法1,算术运算(加减): x=x+y;  //x暂存两数之和 y=x-y;  //y为两数之和减去y,即原来的x x=x-y;  //x为两数之和减去现在的y(原来的x),变成原来的y 方法2,...
  • 方法1:实现两个变量交换不使用第三个变量 我们可以通过数学运算中的差值来实现交换   int a=10,b=20;     a=a+b;     b=a-b;     a=a-b;     交换成功,运行结果如下图 ...
  • 一、通过使用中间变量的方法来交换 二、通过异或的方式来交换
  • //交换两个数的函数实现的原型 int main(void) { int a, b; printf(“请输入你要交换的整数:\n”); scanf_s("%d%d", &a, &b); swap(&a, &b); printf(“交换后的数为%d %d”, a, b); sy
  • Java中实现两个数的交换使用中间变量的方法,无外乎采用引用的方法: void swap(int &amp;a,int &amp;b){ int temp; temp = a; a = b; b = temp; } 或者使用指针: void swap(int *a,int *b){ ...
  • c语言 用两个变量实现整数交换
  • //交换两个数的函数实现的原型 int main(void) { int a, b; printf(“请输入两个整数\n”); scanf_s("%d", &a);//将两个整数读入到缓存区中去 scanf_s("%d", &b); change(&a, &b);//为
  • 转载地址:点击打开链接JavaScript两个变量交换值(不使用临时变量)概要 本文主要描述,如何不使用中间值,将两个变量的值进行交换。 前三种只适用于number类型的数值交换,第四和第五种适合其他类型。一、普通...
  • c语言实现交换两个整数的三种常见方法 1. round 1 定义一个临时变量tmp并把a的值赋给tmp,然后将b的值赋给a,最后将tmp中的值赋给b。 int main() { int a, b; scanf("%d%d", &a, &b); //输入两个整数 ...
  • 举例:输入 a = 6, b = 2 输出 a = 2, b =6 var a = 6; var b = 2; b = a - b; //b=4 a = a - b // a=2 b = a + b //b=6 console.log(a, b)
  • // 编写一个函数,使用指针形参交换两个整数的值。 void exchange(int *p, int *q) { // 定义一个交换变量 int temp; // 交换 temp = *p; *p = *q; *q = temp; } int main() { int i = 42,...
  • 交换两个整数的三种方法

    千次阅读 2021-01-30 17:15:54
    交换两个整数的三种方法 1、第一种相信大家并陌生,就是创建临时变量的方法,这种方法也是很多程序员经常用的方法 即: 2、第二种方法是加减法,即 在这里插入图片描述 但是这种方法有缺陷,就是当a,b的值足够大...
  • 用函数交换两个整数的值

    千次阅读 2020-02-08 01:33:47
    交换两个整数的值有很多种方法,设置临时变量的情况下,可以加减两个数,用异或等·,很实用,其次有设置临时变量,这个相比较于前面提到的效率高了些,也比较简单,在这里就讲解了。今天想说的是定义一个函数...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 106,520
精华内容 42,608
关键字:

不使用变量交换两个整数

友情链接: 1.rar