首页 > 试题广场 >

不用额外变量交换两个整数的值

[编程题]不用额外变量交换两个整数的值
  • 热度指数:1560 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
不用额外变量交换两个整数的值。

输入描述:
输出一行,包含两个整数n和m


输出描述:
输出交换后的n和m的值。
示例1

输入

2 3

输出

3 2

备注:
时间复杂度,额外空间复杂度
异或运算满***换律和结合律:
a ^ b = b ^ a,交换律
(a ^ b) ^ c = a ^ (b ^ c)

本题思路
先令a = a ^ b
再执行b = b ^ a,其中a是 最初的a ^ b,则 b = b ^ (a ^ b),由交换律和结合律,b = 最初的a
再执行a = a ^ b,其中,a是最初的a ^ b,b是最初的a,因此,a  = (a ^ b) ^ a,即,a=最初的b

然而,Intel IA-32架构处理器从奔腾4系列,就提供了XCHG指令,用于交换两个变量的值,我们为什么要写这些奇怪的位操作?
编辑于 2020-05-08 21:10:58 回复(0)
#include <bits/stdc++.h>
using namespace std;

int main(){
    int n, m;
    scanf("%d%d", &n, &m);
    n = n^m;
    m = n^m;
    n = n^m;
    printf("%d %d\n", n, m);
}

发表于 2020-04-23 00:38:23 回复(0)
int m = scanner.nextInt();
int n = scanner.nextInt();
System.out.print(n+" "+m); // doge

发表于 2020-04-21 21:58:16 回复(0)
a=a+b;
b=a-b;
a=a-b;
发表于 2019-11-20 14:17:06 回复(0)
#include<stdio.h>
int main()
{
	int a,b;
    while (scanf("%d %d",&a,&b)!=EOF)
    {
        a=a^b;
        b=b^a;
        a=a^b;
        printf("%d %d\n",a,b);
    }
    return 0;
}

发表于 2021-09-20 16:52:55 回复(0)
n,m=map(int,input().split())
print(m,n)

编辑于 2021-06-11 08:39:48 回复(0)
 
#include <bits/stdc++.h>

using namespace std;

int main() {
    int n, m;
    scanf("%d%d", &n, &m);
    n ^= m;
    m ^= n;
    n ^= m;
    printf("%d %d", n, m);
    return 0;
}


发表于 2020-06-13 23:27:57 回复(0)
a=a+b
b=a-b
a=a-b
发表于 2020-05-27 11:06:55 回复(0)
#include <stdio.h>

int main()
{
    int m,n;
    scanf("%d %d",&n ,&m);
    n = n ^ m;
    m = n ^ m;
    n = n ^ m;
    printf("%d %d\n",n ,m);
}

发表于 2020-05-16 21:22:17 回复(0)
var line=readline().split(' ').map(Number)
var a=line[0]
var b=line[1]
// 使用a保存a和b的差
a=b-a;//3-2=1
// b=b-两数之差
b=b-a;//3-1=2
// a=两数之差+原来的a
a=a+b;//1+2=3
console.log(a,b)

发表于 2020-04-17 21:34:06 回复(0)
不使用异或运算
#include <iostream>
using namespace std;

int main() {
    int n, m;
    cin >> n >> m;
    n = n + m;
    m = n - m;
    n = n - m;
    cout << n << " " << m << endl;
    return 0;
}


发表于 2019-12-23 13:40:51 回复(0)
public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int a, b;
        a = sc.nextInt();
        b = sc.nextInt();
        a = a^b;
        b = a^b;
        a = a^b;
        System.out.println(a + " " + b);
    }

发表于 2019-12-02 15:55:17 回复(0)
a = a^b;
b = a^b;
a = a^b;
发表于 2019-11-14 11:12:42 回复(0)
#include <iostream>

int main(){
    int n,m;
    std::cin>>n>>m;
    std::cout<<m<<" "<<n;
    return 0;
}

我好想想得太简单了。。。。。。。
发表于 2019-10-21 21:59:36 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        
        n = n ^ m;
        m = n ^ m;
        n = n ^ m;
        System.out.print(n +" " +m);
    }
}
发表于 2019-08-09 12:19:22 回复(0)
import java.util.*;
public class Main {
   public static void main(String[] args) {
       Scanner sc = new Scanner(System.in);
       int n = sc.nextInt();
       int m = sc.nextInt();
       n = n + m;
       m = n - m;
       n = n - m;
       System.out.println(n+ " " + m);
   }
}

发表于 2019-08-02 14:50:23 回复(0)