关于如何交换两个数

1.给定两个整形变量的值,将两个值的内容进行交换。

思路:在计算机中并不像人脑能够直接将两变量内容直接交换,但是我们可以临时定义一个中间变量,借助中间变量实现两个变量内容的交换。

//An highlighted blockvar foo = 'bar';
#include<stdio.h>
int main()
{
  int i=62, j=24, t=0;
  printf("%d  %d\n", i, j);
  t = j;
  j = i;
  i = t;
  printf("After change :%d  %d\n", i, j);
  system("pause");
  return 0;
}

成功交换

2.不允许创建临时变量,交换两个数的内容

一、思路:可以利用数学的特性交换,两数相加的总数减去其中一个数就是另一个数。

//An highlighted blocked foo = 'bar';
#include<stdio.h>
int main()
{
 int i = 62, j = 24;
 printf("%d  %d\n", i, j);
 i = i+j;
 j = i-j;
 i = i-j;
 printf("After change :%d  %d\n", i, j);
 system("pause");
 return 0;
}

弊端:加减中,如果数字的太大,这样会造成溢出的状况,即a和b的取值是局限的。

二、思路切换:根据二进制的特性,把i ^ j的值赋给i,这样j=i ^ j中就相当于原来的i ^ j ^ j,这样i的值就赋给了j;
同样的道理,在下一步中i=i ^ j就相当于原来的i ^ j ^ i,这样j的值就赋给了i;这样也能达到数值的交换,并且没有过多的局限性。

//An highlighted blocked foo = 'bar';
#include<stdio.h>
int main()
{
 int i = 62, j = 24;
 printf("%d  %d\n", i, j);
 i = i^j;
 j = i^j;
 i = i^j;
 printf("After change :%d  %d\n", i, j);
 system("pause");
 return 0;
}

但是在实际编程中,还是使用中间变量来得更加方便快捷。

3. 将数组A中的内容和数组B中的内容进行交换。(数组一样大)

思路:建立两个数组a、b,并对数组内进行赋值,使用循环对数组内的值遍历,将a、b两个值通过前述1.进行交换。这很简单!
那么是否能提高一下难度,对后面这个功能建立函数进行调用呢?
首先看一段代码:

//An highlighted blockvar foo = 'bar';
#include 
void Swap1(int x, int y)
{
 int tmp = 0;
 tmp = x;
 x = y;
 y = tmp;
}
void Swap2(int *px, int *py)
{
 int tmp = 0;
 tmp = *px;
 *px = *py;
 *py = tmp;
}
int main()
{
 int num1 = 1;
 int num2 = 2;
 Swap1(num1, num2);
 printf("Swap1::num1 = %d num2 = %d\n", num1, num2);
 Swap2(&num1, &num2);
 printf("Swap2::num1 = %d num2 = %d\n", num1, num2);
 return 0;
}

在这里插入图片描述
显然直接传值进行交换是不行的。需要借助指针,传址传参这样就可以交换数组的值了。

//An highlighted blockvar foo = 'bar';
#pragma warning(disable:4996)
#include<stdio.h>
int exch(int *arr1[10], int *arr2[10])
{
 int j;
 int t;
 for (j = 0; j < 10; j++)
 {
  t = arr1[j];
  arr1[j] = arr2[j];
  arr2[j] = t;
 }
}
int main()
{
 int a[10], b[10];
 int i;
 printf("please input a:\n");
 for (i = 0; i < 10; i++){
  scanf("%d", &a[i]);
 }
 printf("please input b:\n");
 for (i = 0; i < 10; i++) {
  scanf("%d", &b[i]);
 }
 exch(&a, &b);
 printf("after exchange a:");
 for (i = 0; i < 10; i++)
 {
  printf("%d\t", a[i]);
 }
 printf("\nafter exchange b:");
 for (i = 0; i < 10; i++)
 {
  printf("%d\t", b[i]);
 }
 system("pause");
 return 0;
}

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值