前言:鄙人希望读者先自己做一下,这样收获才会更大,有其他想法可以留言
题1.在一个整型数组中,只有一个数字出现一次,其他数字都是成对出现的,请找出那个只出现一次的数字(找出那个单身狗数字)。
例如:
数组中有:1 2 3 4 5 1 2 3 4,只有5出现一次,其他数字都出现2次,找出5
想一想,题目有一个前提:数字成对出现,其中在学习过程中我们知道了 a^a=0,a^0=a
那么1^2^3^4^5^1^2^3^4,该按位异或关系位置可以交换,得1^1^2^2^3^3^4^4^5=?,
当然是5了
#include<stdio.h>
int dog(int ar[9])
{
int a = 0;
for (int n = 0; n < 9; n++)
{
a ^= ar[n];
}
return a;
}
int main()
{
int arr[9] = { 1,2,3,4,5,1,2,3,4 };
int ret = dog(arr);
printf("单身Dog为:%d", ret);
return 0;
}
提醒一下:for循环中a经过9次循环即为:
0^ar[0]^ar[1]^ar[2]^……ar[8]^ar[9]=0^1^2^3^4^5^1^2^3^4
改为自己输入数 (感兴趣的小伙伴可以自己编一下)
#define x 9 //简单理解一下,就是定义x=9, 作用:方便修改
#include<stdio.h>
int dog(int ar[x])
{
int a = 0;
for (int n = 0; n < x; n++)
{
a ^= ar[n];
}
return a;
}
int main()
{
int arr[x] = { 0 };
for (int i = 0; i < x; i++)
{
scanf("%d", &arr[i]);
}
int ret = dog(arr);
printf("单身Dog为:%d", ret);
return 0;
}
题 2.不能创建临时变量(第三个变量),输入两个整数实现两个整数的交换
例如:
输入:a=5,b=3 输出a=3,b=5
方法一:
#include<stdio.h>
int main()
{
int a = 0, b = 0;
scanf("%d%d", &a, &b);
printf("a=%d,b=%d\n", a, b);
a = a + b; //一式
b = a - b; //二式 由于a=a+b, 代入二式得b=a+b-b=a
a = a - b; //三式 在二式中求得b=a,代入三式得a=a+b-a=b
printf("a=%d,b=%d", a, b);
return 0;
}
int取值范围为-32768~32767
这个代码是有缺陷的,当a,b足够大的时候,a=a+b 时会发生截断
方法二(改进):
首先知道:a^a=0 a^0=a
#include<stdio.h>
int main()
{
int a = 0, b = 0;
scanf("%d%d", &a, &b);
printf("a=%d,b=%d\n", a, b);
a = a ^ b; // 一式
b = a ^ b; // 二式 在一式中 a = a^b代入二式得b = a^b^b = a^0 = a
a = a ^ b; // 三式 在二式中 b = a 带入三式a=a^b^a = a^a^b = 0^b = b
printf("a=%d,b=%d", a, b);
return 0;
}