基础数学问题

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\n", 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;
}
posted @ 2020-06-18 21:55  w_w_t  阅读(163)  评论(0编辑  收藏  举报