【牛客网】C语言入门 - CC3 编写函数实现两数交换(指针方式)

题目描述

题目链接:编写函数实现两数交换(指针方式)

描述
编写一个函数,实现两个整数的交换,要求采用指针的方式实现。
输入描述:
键盘输入2个整数 m 和 n
输出描述:
输出交换后m 和 n 的值,中间使用空格隔开

示例1

输入:2
     3
输出:3 2

解题分析:

这道题使用函数实现交换功能,考察的是传址调用。有三种解题方法:

思路1:利用临时变量。

思路3:不使用临时变量,利用加减运算符。

思路2:不使用临时变量,利用按位异或运算符。

异或运算规则:0 ^ a = a,a ^ a = 0,a ^ b ^ a = b,a ^ b ^ b = a


代码实现:

方法1

#include <stdio.h>
void swap(int* x,int* y)
{
	//有临时变量
    int tmp = *x;
    *x = *y;
    *y = tmp;
}
int main() 
{
    int m = 0, n = 0;
    scanf("%d", &m);
    scanf("%d", &n);
    swap(&m,&n);
    printf("%d %d",m,n);
    
    return 0;
}

方法2

#include <stdio.h>
void swap(int* x,int* y)
{
	//无临时变量
	*x = *x + *y;//m = 8,n = 5
	*y = *x - *y;//n = 3,m = 8
	*x = *x - *y;//m = 5,n = 3;
	//当两个数超级大时,相加的结果可能会有溢出
}
int main() 
{
    int m = 0, n = 0;
    scanf("%d", &m);//m = 3
    scanf("%d", &n);//n = 5
    swap(&m,&n);
    printf("%d %d",m,n);
    
    return 0;
}

方法3

#include <stdio.h>
void swap(int* x,int* y)
{
	//异或方法,兼容了以上两种,无临时变量,且不会结果溢出
	//a ^ b ^ b = a,a ^ b ^ a = b
	//0 ^ a = a, a ^ a = 0
	*x = *x ^ *y;
	*y = *x ^ *y;//a ^ b ^ b = a
	*x = *x ^ *y;//a ^ b ^ a = b 
}
int main() 
{
    int m = 0, n = 0;
    scanf("%d", &m);
    scanf("%d", &n);
    swap(&m,&n);
    printf("%d %d",m,n);
    
    return 0;
}
  • 非函数实现
#include <stdio.h>
int main()
{
	int a = 3;
	int b = 5;
	printf("before:a = %d,b = %d\n", a, b);
	//方法1:有临时变量
	int tmp = 0;
	tmp = a;
	a = b;
	b = tmp;

	//方法2:无临时变量
	a = a + b;//a = 8,b = 5
	b = a - b;//b = 3,a = 8
	a = a - b;//a = 5,b = 3;
	//当两个数超级大时,相加的结果可能会有溢出

	//方法3:异或方法,兼容了以上两种
	//a ^ b ^ b = a,a ^ b ^ a = b
	//0 ^ a = a, a ^ a = 0
	a = a ^ b;
	b = a ^ b;//a ^ b ^ b = a
	a = a ^ b;//a ^ b ^ a = b 

	printf("after: a = %d,b = %d\n", a, b);
	return 0;
}

注意:对于非函数的实现,是主函数内的操作,不需要使用指针操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值