一道算法題,(位運算)

兩個數組,其中一個包含有n個數1 <= n <= 400000 另一個有n-1個數,數組中的數大小 <= 1000000000;數組中無重複數。

開始時利用第一個數組一次減去第二個數組。

#include "stdio.h"
int main(){
		int num = 4;
		int all[] = {1000,10003,10002,123456};
		int a[] = {1000,10003,123456};
		int liu = 0;
		for(int i = 0; i < num-1; i++){
			liu = all[i] - a[i];
		}
		liu = liu - all[num-1];
		printf("%d \n",liu);
		return 1;
}

我測試用的數據較小,所以運行起來沒有問題,提交運行後不能全部通過。是由於兩個數組中的數據並非有序。而且不是一一對應是由於,所以容易造成溢出問題。

使用異或解決。

#include "stdio.h"
int main(){
		int num = 4;
		int all[] = {1000,10003,10002,123456};
		int a[] = {1000,10003,123456};
		int liu = 0;
		for(int i = 0; i < num-1; i++){
			liu = all[i]^a[i];
		}
		liu = liu ^ all[num-1];
		printf("%d \n",liu);
		return 1;
}


遇到大數運算時,多采用位運算。

關於位運算。

運算符  含義
&    按位與
|    按位或
^    按位異或
~    取反
<<   左移
>>   右移

1,按位與運算符(&)

運算規則:0&0=0;   0&1=0;    1&0=0;     1&1=1;

即:兩位同時爲“1”,結果才爲“1”,否則爲0

2 按位或運算符 |

0|0=0; 0|1=1; 1|0=1; 1|1=1;
兩個相應的二進位中只要有一個爲 1,該位的結果就爲 1。
3 異或運算符 ^
異或運算符 ^ 也稱 XOR 運算符。它的規則是若參加運算的兩個二進位同號,則結果爲0,異號則爲1。

即 0^0=0; 0^1=1; 1^0=1;1^1=0;
4 取反運算符 ~
~是一個頭單目運算符,用來對一個二進制按位取反,即將 0 變 1,1變 0。例如~25 是對八進制數 25 (即 00010101)按位取反。
5 左移運算符 <<
用來將一個數各二進位全部左移若干位。例如:a = a << 2;
將 a 的二進制數左移 2 位,右補 0,若 a = 15,即二進制數 00001111,左移2位得到 00111100,即十進制數60.
 高位左移後溢出,捨棄不起作用。左移一位相當於該數乘以2。但些結論只適用於該數左移時被溢出捨棄的高位中不包含1 的情況。

6右移運算符 >>
a >> 2 表示將 a 的各二進位右移 2 位。移到右端的低位被捨棄,對無符號數,高位補 0。如 a = 017 時:a = 00001111 >> 2
00000011
右移一位相當於除以 2 ,右移 n 位相當於除於 2^n。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章