c语言实现两数交换的三种方法
实现变量的值互相交换的三种不同方法
方法一:利用第三个变量来实现数值的交换
int tmp;
tmp = a;
a = b;
b = tmp;
此方法直观,简易。不易出错,推荐使用
方法二:利用两个变量间的加减运算实现数值的交换
a=a+b;
b=a-b;
a=a-b;
//a=a-b;
//b=a+b;
//a=b-a;
注:在某些运算中会出现bug,不建议使用
方法三:利用按位异或运算实现数值的交换
a=a^b;//bug,自身异或为0
b=a^b;
a=a^b;
注:同样的在某些运算中会出现bug,不建议使用
需要注意的是后两种方法在某些情况下会产生bug,所以建议用第一种方法
完整代码:
编写为函数时
C语言中用指针 void Swap(int *p1,int *p2);
c++中可用引用的方式 void Swap(const int &p1,const int &p2);
#include<stdio.h>
void Swap1(int *p1,int *p2)
{
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
void Swap2(int *p1,int *p2)
{
*p1=*p1-*p2;
*p2=*p1+*p2;
*p1=*p2-*p1;
}
void Swap3(int *p1,int *p2)
{
*p1=*p1^*p2;
*p2=*p1^*p2;
*p1=*p1^*p2;
}
int main()
{
int a = 10;
int b = 20;//测试用例
Swap1(&a,&b);
//Swap2(&a,&b);
//Swap3(&a,&b);
printf("%d %d",a,b);
return 0;
}
方法二、三存在bug,在某些情况下会出错,比如:
#include<stdio.h>
void Swap1(int *p1,int *p2)
{
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
void Swap2(int *p1,int *p2)
{
*p1=*p1-*p2;
*p2=*p1+*p2;
*p1=*p2-*p1;
}
void Swap3(int *p1,int *p2)//bug 测试
{
*p1 ^= *p2;
*p2 ^= *p1;
*p1 ^= *p2;
}
void Rerverse1(int *arr,int len)//数组逆置,用方法一
{
for(int i=0;i<=len/2;i++)
{
Swap1(&arr[i],&arr[len-1-i]);
}
}
void Rerverse2(int *arr,int len)//数组逆置,用方法二
{
for(int i=0;i<=len/2;i++)
{
Swap2(&arr[i],&arr[len-1-i]);
}
}
void Rerverse3(int *arr,int len)//数组逆置,用方法三
{
for(int i=0;i<=len/2;i++)
{
Swap3(&arr[i],&arr[len-1-i]);
}
}
void Show(int *arr,int len)//打印函数
{
for(int i=0;i<len;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9};
Rerverse1(arr,sizeof(arr)/sizeof(arr[0]));//用方法一
Show(arr,sizeof(arr)/sizeof(arr[0]));//打印逆置后的数组
int brr[] = {1,2,3,4,5,6,7,8,9};
Rerverse2(brr,sizeof(brr)/sizeof(brr[0]));//用方法二
Show(brr,sizeof(brr)/sizeof(brr[0]));//打印逆置后的数组
int crr[] = {1,2,3,4,5,6,7,8,9};
Rerverse3(crr,sizeof(crr)/sizeof(crr[0]));//用方法三
Show(crr,sizeof(crr)/sizeof(crr[0]));//打印逆置后的数组
return 0;
}
输出结果为
9 8 7 6 5 4 3 2 1
9 8 7 6 0 4 3 2 1
9 8 7 6 0 4 3 2 1
其中方法二与方法三都出了bug,所以建议使用方法一进行两数间的交换
c语言实现两数交换的三种方法的更多相关文章
- 实验02——java两个数交换的三种解决方案
package cn.tedu.demo;/** * @author 赵瑞鑫 E-mail:1922250303@qq.com * @version 1.0* @创建时间:2020年7月16 ...
- JS变量和变量交换的三种方法
一.what 变量就是用来存储数据的容器 二.how 通过var 关键字定义一个变量 var n1; //定义变量 变量的赋值:通过赋值运算符“=” 给变量赋值. var n2=123; //定义变量 ...
- 在C语言中不使用任何中间变量如何将a、b的值进行交换(三种方法)——来自一小萌新工程师的复习
今天面试嵌入式,突然遇到这么一道题目,虽然简单,但鉴于我答得不是很好,所以还是分析一下为好. 第一种方法: 通过加减法. #include"stdio.h" int main(vo ...
- Python 文件行数读取的三种方法
Python三种文件行数读取的方法: #文件比较小 count = len(open(r"d:\lines_test.txt",'rU').readlines()) print c ...
- java交换两个值的三种方法 经典
1.中间变量(在开发中常用) int c=a; a=b; b=c; System.out.println("a的值: "+a+" b的值: "+b); 2.按位 ...
- go语言中获取变量类型的三种方法
package main import ( "fmt" "reflect" ) func main() { var num float64 = 3.14 // ...
- C语言与汇编的嵌入式编程:main中模拟函数的调用(两数交换)
编写一个两数交换函数swap,具体代码如下: #include<stdio.h> void swap(int *p1,int *p2) { int temp; temp = *p1; *p ...
- LeetCode:两数之和、三数之和、四数之和
LeetCode:两数之和.三数之和.四数之和 多数之和问题,利用哈希集合减少时间复杂度以及多指针收缩窗口的巧妙解法 No.1 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在 ...
- c#封装DBHelper类 c# 图片加水印 (摘)C#生成随机数的三种方法 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象 c# 制作正方形图片 JavaScript 事件循环及异步原理(完全指北)
c#封装DBHelper类 public enum EffentNextType { /// <summary> /// 对其他语句无任何影响 /// </summary> ...
随机推荐
- 由浅入深--MyBatis系列
从今天开始将要开始由浅入深--MyBatis系列博客的编写; 主要目录如下: MyBatis基础知识篇 1.由浅入深---ORM简介 2.由浅入深---MyBatis的整体架构 3.由浅入深---第一 ...
- 哈工大 NLP 实验一 汉语分词系统
NLP实验代码可见github:NLP实验代码整理 本实验会查重,而且写起来难度比较大,建议早一些开始.实验报告要用顶会论文形式呈现,建议使用overleaf里的ACL论文latex模板比较方便一点.
- 【实测】Python 和 C++ 下字符串查找的速度对比
完整格式链接:https://blog.imakiseki.cf/2022/03/07/techdev/python-cpp-string-find-perf-test/ 背景 最近在备战一场算法竞赛 ...
- dependencies与devDependencies中应该放哪些依赖
网上一般的解释都是,开发环境用devDependencies,生产环境用dependencies,说的很简明,但是这里有个问题是,哪些包需要放到devDependencies中,哪些包需要放到depe ...
- python+pytest接口自动化(6)-请求参数格式的确定
我们在做接口测试之前,先需要根据接口文档或抓包接口数据,搞清楚被测接口的详细内容,其中就包含请求参数的编码格式,从而使用对应的参数格式发送请求.例如某个接口规定的请求主体的编码方式为 applicat ...
- jQuery-ajax-天气接口
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- php jsonp接口
//jsonp回调 $callback = isset($_GET['callback']) ? trim($_GET['callback']) : ''; //jsonp回调参数,必需 $cgc_k ...
- Sublime Text3中文环境设置
Sublime Text3中文环境设置 1.首先打开安装好的的Sublime软件,选择Preferences下面的Package Contorol选项出现弹窗方框 2.在弹窗输入install pac ...
- tensorflow源码解析之framework-resource
目录 什么是resource 如何使用resource 如何管理resource 常用resource 其它结构 关系图 涉及的文件 迭代记录 1. 什么是resource 我们知道,TF的计算是由设 ...
- 假设检验的python实现命令——Z检验、t检验、F检验
Z检验 statsmodels.stats.weightstats.ztest() import statsmodels.stats.weightstats as sw 参数详解: x1:待检验数据集 ...