当面试题遇到:交换两整形变量的值。你是感到无比的“庆幸”遇到这么简单的面试题,还是有一点“慌张”,怕是自己想的太简单了吧!今天我们就来处理几道小题,并且深入探讨一下交换两整形的3种C语言实现方法!当你再遇到这种问题的时候,你将一点都不慌!你,稳得一批!
练习题目:
1. 给定两个整形变量的值,将两个值的内容进行交换。
2. 不允许创建临时变量,交换两个数的内容。
3.求10 个整数中最大值。
4.将三个数按从大到小输出。
5.求两个数的最大公约数。
题目分析及代码、结果展示:
1. 没错,它现在就是你想的那种,创建第三变量直接ok的题目...在此不要想太多了!
#include<stdio.h>
int main()
{
int i = 1;
int j = 2;
int tmp = 0; //创建第三变量
printf("%d %d\n", i, j);
tmp = i; //通过第三变量进行交换
i = j;
j = tmp;
printf("%d %d\n", i, j);
return 0;
}
通过创建第三变量实现两个整数值的交换,使我们最为常见的方法,在这我们也就不多赘述,毕竟后面才是我们的重头戏!
2. 当你潇洒写出上面的代码的时候,面试官狡黠一笑向你提出:“不允许创建第三变量,能不能搞定”。首先,你应该回复:“能啊!”(管它能不能,能就对了!)到了思考时间,我们来想一想这个过程,我们的目的就是为了交换两个整数的值,那么可以寻找到怎样的关系式将两者串联起来呢?假设有A、B两数,将两者相加赋给A,此时A=A+B,那么再有B=A-B,此时完成了A的值就传给了B,那么只需要进行最后一步A=A-B,此时的A=A+B,B就是A的值,就把B的值传给了A,也就达到了我们的目的。
#include<stdio.h>
int main()
{
int i = 18;
int j = 23; //未创建第三变量
printf("%d %d\n", i, j);
i = i + j; //执行逻辑算法
j = i - j;
i = i - j;
printf("%d %d\n", i, j);
return 0;
}
这个的逻辑算是比较简单,需要去培养和树立这样的逻辑来丰富我们的眼界,再遇到这个问题就能做了。在这,我们再介绍一种高大上的方法:采用“异或操作符”,进行两整数的交换!
#include<stdio.h>
int main()
{
int i = 1;
int j = 2; //未进行第三变量创建
printf("%d %d\n", i, j);
i = i^j; //使用异或操作符
j = i^j;
i = i^j;
printf("%d %d\n", i, j);
return 0;
}
可以看到这个操作符的使用也是很简单的解决了问题!
在这我们不对它进行详细阐述、先思考思考、再自行上网查找资料,相信你会收获更多!
3. 求10个整数的最大值,其实也就是一个数组的遍历比较问题,也可以将之理解为一个排序问题输出那个最大值即可,但是也没必要这么的复杂。
#include<stdio.h>
int main()
{
int i = 0;
int max = 0;
int arr[10] = {0};
for(i=0; i<10; i++)
{
scanf("%d", &arr[i]);
}
max = arr[0];
for(i=0; i<10; i++)
{
if(arr[i]>max)
max = arr[i];
}
printf("max = %d\n",max);
return 0;
}
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
int max = 0;
scanf("%d %d %d", &a, &b, &c);
if(a>b)
max = a;
else
max = b;
if(c>max)
max = c;
printf("max= %d\n", max);
return 0;
}
#include <stdio.h>
int main()
{
int a,b,r;
printf("请输入两个正整数:\n");
scanf("%d %d",&a,&b);
if(a<b)
{
r=a;
a=b;
b=r;
}
//辗转相除法,因为r的初始值不为0,所以while语句至少会执行一次
//直至余数为零,跳出循环
while(r!=0)
{
r=a%b;
a=b;
b=r;
}