当前位置: 首页 > news >正文

C语言交换两数

1. 简介

交换两数一般需要借助第三个数当作临时变量;

这里介绍几种不需要临时变量的写法,当然可能还有别的方法。

2. 方法

2.1 借助中间变量
void swap1(int *pa, int *pb)
{
    int tmp = *pa;
    *pa     = *pb;
    *pb = tmp;
}
2.2 利用加减运算符
void swap2(int *pa, int *pb) 
{
    *pa += *pb;
    *pb  = *pa - *pb;
    *pa -= *pb;
}
2.3 利用乘除运算符
void swap3(int *pa, int *pb)
{
    *pa *= *pb;
    *pb  = *pa / *pb;
    *pa /= *pb;
}
2.4 利用异或运算符
void swap4(int *pa, int *pb)
{
    *pa ^= *pb;
    *pb ^= *pa;
    *pa ^= *pb;
}

3. 总结

事实上,我们只需要找到运算符 o p 1   o p 2 op_1\ op_2 op1 op2, 满足
a = a   o p 1   b   o p 2   b b = a   o p 1   b   o p 2   a a = a\ op_1\ b \ op_2\ b\\ b= a\ op_1\ b\ op_2\ a a=a op1 b op2 bb=a op1 b op2 a
就可以不借助中间变量交换两个变量

  • 代码
#include <stdio.h>
void swap1(int *pa, int *pb)
{
    int tmp = *pa;
    *pa     = *pb;
    *pb = tmp;
}
void swap2(int *pa, int *pb) 
{
    *pa += *pb;
    *pb  = *pa - *pb;
    *pa -= *pb;
}
void swap3(int *pa, int *pb)
{
    *pa *= *pb;
    *pb  = *pa / *pb;
    *pa /= *pb;
}
void swap4(int *pa, int *pb)
{
    *pa ^= *pb;
    *pb ^= *pa;
    *pa ^= *pb;
}
int main()
{
    int a0 = 3;
    int b0 = 4;

    printf("before swap1: a0: %d, b0: %d\n", a0, b0);
    swap1( &a0, &b0);
    printf("after swap1: a0: %d, b0: %d\n", a0, b0);

    int a1 = 10;
    int b1 = 22;

    printf("before swap2: a1: %d, b1: %d\n", a1, b1);
    swap2( &a1, &b1);
    printf("after swap2: a1: %d, b1: %d\n", a1, b1);

    int a2 = -243;
    int b2 = 829;

    printf("before swap3: a2: %d, b2: %d\n", a2, b2);
    swap3( &a2, &b2);
    printf("after swap3: a2: %d, b2: %d\n", a2, b2);


    int a3 = 934;
    int b3 = -234;

    printf("before swap4: a3: %d, b3: %d\n", a3, b3);
    swap4( &a3, &b3);
    printf("after swap4: a3: %d, b3: %d\n", a3, b3);

    return 0;
}

相关文章:

  • Dijkstra算法
  • 【蓝桥】模拟
  • Day16:字符串的排列
  • eBPF 实时捕获键盘输入
  • Day2 导论 之 「存储器,IO,微机工作原理」
  • 【测试篇】打破测试认知壁垒,从基础概念起步
  • 零基础上手Python数据分析 (5):Python文件操作 - 轻松读写,数据导入导出不再是难题
  • 【SpringMVC】常用注解:@RequestHeader
  • sentinel限流算法
  • 《DeepSeek深度使用教程:开启智能交互新体验》Deepseek深度使用教程
  • 第五章 树、2叉树
  • 這是我第一次寫關於aapenal服務器管理控制面板的文章
  • “个人陈述“的“十要“和“十不要“
  • 1、操作系统引论
  • Certbot实现SSL免费证书自动续签(CentOS 7 + nginx/apache)
  • (undone) 梳理 xv6-lab-2023 fs.img 生成过程,以及文件系统结构
  • QT编程之QStackedWidget
  • 自定义tiptap插件
  • obsidian中Text Generate的使用教程(以DeepSeek为例)
  • TTS语音模型调用出错
  • 韩国法院将重审李在明案,韩德洙入局能否为大选带来变数?
  • 视频丨英伟达总裁黄仁勋:美勿幻想AI领域速胜中国
  • 美国第一季度经济环比萎缩0.3%,特朗普:怪拜登,与关税无关
  • 三家“券商系”公募同日变更掌门人,新董事长均为公司股东方老将
  • 大学2025丨对话深大人工智能学院负责人李坚强:产学研生态比“造天才”更重要
  • 5月起,这些新规将施行