十五、公开课
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;
}