找出所有给定数字的因数和它们的位数XOR
给定一个整数N,任务是找出N的所有因子(不包括它本身)和它们的XOR。
例子:
输入。N = 8
输出:
除数是。1 2 4
XOR。7
解释。 1、2、4都是8的因子,1^2^4=7。输入。N = 25
输出:
除数是。1 5
Xor:4
**办法。**按照下面的思路来解决这个问题。
存储给定数字N的所有因数,并计算所有因数的xor。
按照以下步骤来解决这个问题。
- 初始化一个变量Xor=0
- 创建向量factor1和factor2,用于存储从1到sqrt(N)和从sqrt(N)到N的因子。
- 从1到sqrt(N)遍历数组
- 如果N % i = 0,在factors1中追加i,Xor = Xor^i
- 并检查 如果N / i != i,在因子2中追加N / i,Xor = Xor^(n / i)
- 在执行循环后,将因子2的元素以相反的顺序插入因子1中。
- 从因子1向量中弹出元素N。
- 打印 因子1向量并返回 Xor^N,因为我们已经在Xor中计算了N。
下面是上述方法的实现。
C++
// C++ code for the above approach
#include <bits/stdc++.h>
using namespace std;
// Function to find all the divisors
// of N (excluding N) in sorted order
// and returning Xor of all factors of
// N except itself
int findAllFactors(int n)
{
int Xor = 0;
// To store factors from 1 to sqrt(n)
vector<int> factors1;
// To store factors from sqrt(n) to n
vector<int> factors2;
// Traverse from 1 to sqrt(n)
for (int i = 1; i * i <= n; i++) {
if (n % i == 0) {
factors1.push_back(i);
Xor ^= i;
if (n / i != i) {
factors2.push_back(n / i);
Xor ^= (n / i);
}
}
}
// Append factors2 in factors1 in reverse order
factors1.insert(factors1.end(), factors2.rbegin(),
factors2.rend());
// Pop back 1 element from resultant
// vector to remove N from factors
factors1.pop_back();
cout << "Divisors are: ";
for (auto i : factors1) {
cout << i << " ";
}
cout << endl;
cout << "Xor: ";
return Xor ^ n;
}
// Driver Code
int main()
{
int N = 8;
// Function call
cout << findAllFactors(N) << endl;
return 0;
}
输出
Divisors are: 1 2 4
Xor: 7
时间复杂度。O(N1/2),其中N是给定的整数。
辅助空间。O(N1/2),用于存储给定整数的所有因子。