找出所有给定数的因数和它们的位数XOR

196 阅读2分钟

找出所有给定数字的因数和它们的位数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
  • 创建向量factor1factor2,用于存储从1到sqrt(N)和从sqrt(N)到N的因子。
  • 1sqrt(N)遍历数组
    • 如果N % i = 0,在factors1中追加iXor = Xor^i
    • 并检查 如果N / i != i,在因子2中追加N / iXor = 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),用于存储给定整数的所有因子。