package main import ( "fmt" ) func main() { num := 0 for { n, _ := fmt.Scan(&num) if n == 0 { break } else { arr := make([]int, num) for i := 0; i < len(arr); i++ { fmt.Scan(&arr[i]) } s, b := process(arr) fmt.Println(s, b) } } } // 异或操作,相同为0,不同为1 // 0^n = n // 0^1 = 1, 0^0 = 0, 1^1=0 func process(arr []int) (int, int) { // 其它数出现偶次,其它数自己和自己xor=0 // 剩下的数位,有2个不同的数各只出现一次,假设为a,b xor := 0 for i := 0; i < len(arr); i++ { xor ^= arr[i] } // xor = a^b // 取出xor中,最右边第一个不为0的数last1 // 如假设xor=100100, last1=100 // arr中所有的数,该为第一个不为0的数进行异或操作 // 异或的结果值为xoraorb就等于 a 或者 b last1 := (^xor + 1) & xor // 此时数组可以分割为2个组别 // 包含a的一组,包含b的一组 xorab := 0 for i := 0; i < len(arr); i++ { // 这里不能写 == 1, // 不一定为最后一个1 if last1 & arr[i] == last1 { xorab ^= arr[i] } } small := xorab big := xorab ^ xor if small > big { small, big = big, small } return small, big }