1.不借助第三个变量,交换两个变量的值。
(1)a = a+b; (2)a = a^b;
b = a-b; b = a^b;
a = a-b; a = a^b;
有整型溢出问题 按位异或,无溢出问题
异或:a^0 = a,a^a = 0
a^b^c = a^c^b(交换律)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
//不借助第三个变量,交换两个变量的值
int main()
{
int a = 0;
int b = 0;
printf("请输入a=");
scanf("%d",&a);
printf("请输入b=");
scanf("%d",&b);
system("cls");
printf("交换前,a=%d b=%d\n",a,b);
//两整型数相加有整型溢出问题(超出int的表示范围)
//a = a+b;
//b = a-b;
//a = a-b;
//按位异或,逻辑运算不会产生溢出。
a = a^b;
b = a^b;
a = a^b;
printf("交换后,a=%d b=%d\n",a,b);
return 0;
}
2.找出只出现一次的数
给定一个非空整型数组,除某个元素只出现一次以外,其余每个元素均出现两次(偶数),找出那个只出现了一次的元素。
(1)每个元素与整个数组元素比较一次
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
//找出只出现一次的数
int main()
{
int arr[] = {1,2,3,4,5,1,2,3,4,5,7};
//找出单身狗
int i = 0;
int sz = sizeof(arr)/sizeof(arr[0]);
for(i=0;i<sz;i++)
{
int count = 0;
int j = 0;
for(j=0;j<sz;j++)
{
if(arr[i]==arr[j])//比较每个元素与整个数组元素
{
count++;
}
}
if(count==1)
{
printf("单身狗:%d\n",arr[i]);
break;
}
}
return 0;
}
(2)0直接异或整个数组元素
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
int main()
{
int arr[] = {1,2,3,4,5,1,2,3,4,5,7};
int i = 0;
int sz = sizeof(arr)/sizeof(arr[0]);
int ret = 0;
for(i=0;i<sz;i++)
{
ret = ret^arr[i];
}
printf("单身狗是:%d\n",ret);
return 0;
}