两个数组,其中一个包含有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。
&spm=1001.2101.3001.5002&articleId=52531230&d=1&t=3&u=ce3d420a364f4e0eaaabf7157eff1d5b)
1万+

被折叠的 条评论
为什么被折叠?



