先说说思路。
首先,可以求出1到10w的总和,设为S0.然后,可以求出这除去俩数后所有数的和S1.由此可以得到俩数之和S2=S0-S1.
接着,可以求出1到10w的所有数的异或值Y0。再求出除去俩数的所有数的异或值Y1,由此可以得到俩数异或值Y2=Y0^Y1.
设俩数是a和b。则a+b=S2,a^b=Y2。接下来就是挨个检查了。a从1到S2/2挨个检查,直到异或值符合条件。
求和,求异或值时间复杂度是O(N), 挨个检查也是O(N),所以总的时间复杂度是O(N)。
具体代码如下所示。
void find(int*w10, int num, int*a,int*b){
int sum=0,yh=0;
for(int k=0; k<num; ++k){
sum+=k+1-w10[k];
yh^=(k+1)^w10[k];
}
sum+=num*2+3;//加上num,num+1后,即为俩数之和
yh^=(num+2)^(num+1);//
for(*a=1;*a*2<sum;++*a)
if(*a^(sum-*a)==yh){//检查
*b=sum-*a;
break;
}
}