数组开大一点 换个输入输出就AC了
用最后的异或和异或每一位元素 如果小于它本身就知道最大的那位1变成了0,也就是找到了应该变的那一位(奇数项的最高位对应的数字)。
异或之后的值就是拿去石子之后剩下的石子。
不懂的可以参考博客:https://blog.csdn.net/k_koris/article/details/81743806
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n,a[300005];
while(scanf("%d",&n)!=EOF)
{
int k,tmp=0;
if(n==0)
break;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
tmp^=a[i];}
if(tmp==0)
//cout<<"No"<<endl;
printf("No\n");
else
{
printf("Yes\n");
for(int i=0;i<n;i++)
{
int t=tmp^a[i];
if(t<a[i])
{
printf("%d %d\n",a[i],t);
}
}
}
}
return 0;
}