1.找筷子
解题思路:
要找出唯一单着的那个数,可以用异或的方式
我们已知 a ^ a = 0 ,对于存在偶数个的数字,迟早会互相抵消,奇数个的数字也会两两抵消,只剩下最后一个答案。
AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main(){
int n;
int a;
scanf("%d", &n );
int ans = 0;
for( int i = 0 ;i < n ; i++ ){
scanf("%d", &a );
ans ^= a;
}
printf("%d
", ans );
return 0;
}
2.高低位交换
解题思路:
(1)模拟
1.将数字转换为2进制字符串s1 Itoa()
2.补前导零,字符串s2先存低位,再存高位(相当于交换)
3.转换为10进制输出 Atoi()
注意 2^32=4294967295,应用long long
AC代码:
https://paste.ubuntu.com/p/JmzMNqP3ZR/
(2)位运算
int型最多存储31位整形,即正负数都有,范围为[-2^31 , 2^31-1],而unsigned int也是31位,但是存储的是正整数,范围为[1,2^32-1]
将这个数左移16位+这个数右移16位就达到了交换高低位的效果,且左移和右移超出的部分会自动溢出。
AC代码:
https://paste.ubuntu.com/p/ttVmPBqMpD/
#include<bits/stdc++.h>
using namespace std;
int main(){
unsigned int n;
cin >> n;
cout << ( n >> 16 ) + ( n << 16 ) << endl;
return 0;
}