练习题

时间:2022-12-08 10:57:44

1.交换两个int变量的值,不能使用第三变量,即a=3,b=5,交换之后,a=5,b=3

#include<stdio.h>
int main()
{
int a=3;
int b=5;
a=a+b;
b=a-b;
a=a-b;
printf("交换后:a=%d b=%d",a,b);
return 0;
}

这代码没有考虑到int值溢出的情况。

#include<stdio.h>
int main()
{
int a=3;
int b=5;
a=a^b;
a=a^b;
b=a^b;
printf("交换后:a=%d b=%d",a,b);
return 0;
}

2.给出一个非空整形数组,除了某个元素出现一次以外,其余每个元素均出现两次,找出那个只出现一次的元素

例如:int a[]={1,2,3,4,5,1,2,3,4},该数组中只有5出现两次,其余数字都是成对出现的,要找出5

#include<stdio.h>
int main()
{
int arr[]={1,2,3,4,5,1,2,3,4};
int i=0;
int sz=sizeof(arr)/sizeof(arr[0]);
for(i=0;i<sz;i++)
{
int j=0;
int count=0;
for(j=0;j<sz;j++)
{
if(arr[i]==arr[j])
{
count++;
}
}
if(count==1)
{
printf("%d",i);
break;
}
}
return 0;
}

优化:3^3=0;5^5=0;0^3=3;0^5=5;3^5^3=5;3^3^5=5;

异或是满足交换律的

#include<stdio.h>
int main()
{
int arr[]={1,2,3,4,5,1,2,3,4};
int i=0;
int ret=0;
int sz=sizeof(arr)/sizeof(arr[0]);
for(i=0;i<sz;i++)
{
ret=ret^arr[i];
}
printf("%d",ret);
return 0;
}