给定正整数N ,任务是打印前N个自然数的前缀按位XOR的所有不同的偶数和奇数值。
例子:
Input: N = 6
Output:
Even: 0 4
Odd: 1 3 7
Explanation:
The prefix Bitwise XOR of the first 6 natural number si {1, 3, 0, 4, 1, 7}.
Even prefix Bitwise XORs are 0, 4.
Odd prefix Bitwise XORs are 1, 3, 7.
Input: N = 9
Output:
Even: 0 4 8
Odd: 1 3 7
方法:可以根据以下观察结果解决给定的问题:
- 如果N模4的值为0 ,则前N个自然数的按位XOR值为N。
- 如果N模4的值为1 ,则前N个自然数的按位XOR值为1 。
- 如果N模4的值为2 ,则前N个自然数的按位XOR值为(N +1) 。
- 如果N模4的值为3 ,则前N个自然数的按位XOR值为0 。
因此,根据上述原理,可以说作为偶数的按位XOR总是以0或4的倍数出现,而作为奇数的按位XOR总是比4的倍数少1或1 。
下面是上述方法的实现。
C++
// C++ program for the above approach
#include
using namespace std;
// Print all distinct even & odd
// prefix Bitwise XORs from 1 to N
void evenOddBitwiseXOR(int N)
{
cout << "Even: " << 0 << " ";
// Print the even number
for (int i = 4; i <= N; i = i + 4) {
cout << i << " ";
}
cout << "\n";
cout << "Odd: " << 1 << " ";
// Print the odd number
for (int i = 4; i <= N; i = i + 4) {
cout << i - 1 << " ";
}
if (N % 4 == 2)
cout << N + 1;
else if (N % 4 == 3)
cout << N;
}
// Driver Code
int main()
{
int N = 6;
evenOddBitwiseXOR(N);
return 0;
}
输出:
Even: 0 4
Odd: 1 3 7
时间复杂度: O(N)
辅助空间: O(1)