兩個數組,其中一個包含有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。