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;
}