📌  相关文章
📜  N的最小值,使得从1到N的xor等于K

📅  最后修改于: 2021-04-26 08:23:34             🧑  作者: Mango

给定值为从1到N的所有值的XOR的值K,任务是找到N的最小值,以使从1到N的XOR等于K。
例子

Input: K = 7
Output: 6
1 ^ 2 ^ 3 ^ 4 ^ 5 ^ 6 = 7

Input: K = 10
Output: Not Possible

方法:此问题类似于从1到n计算XOR。以下是要检查的条件:

  1. 如果k = 0,则N = 3。
  2. 如果k = 1,则N = 1。
  3. 如果k%4 = 0,则N = k。
  4. 如果k%4 = 3,则N = k-1。

下面是上述方法的实现:

C++
// C++ implementation of above approach
#include 
using namespace std;
 
// Function to find the value of N
int findN(int k)
{
     
    // variable to store the result
    int ans;
 
    // handling case for '0'
    if (k == 0)
        ans = 3;
 
    // handling case for '1'
    if (k == 1)
        ans = 1;
 
    // when number is completely divided by
    // 4 then minimum 'x' will be 'k'
    else if (k % 4 == 0)
        ans = k;
 
    // when number divided by 4 gives 3 as
    // remainder then minimum 'x' will be 'k-1'
    else if (k % 4 == 3)
        ans = k - 1;
 
    // else it is not possible to get
    // k for any value of x
    else
        ans = -1;
 
    return ans;
}
 
// Driver code
int main()
{
    // let the given number be 7
    int k = 7;
 
    int res = findN(k);
    if (res == -1)
        cout << "Not possible";
    else
        cout << res;
 
    return 0;
}


Java
// Java implementation of
// above approach
import java.io.*;
 
class GFG
{
 
// Function to find the
// value of N
static int findN(int k)
{
     
    // variable to store
    // the result
    int ans;
 
    // handling case for '0'
    if (k == 0)
        ans = 3;
 
    // handling case for '1'
    if (k == 1)
        ans = 1;
 
    // when number is completely
    // divided by 4 then minimum
    // 'x' will be 'k'
    else if (k % 4 == 0)
        ans = k;
 
    // when number divided by 4
    // gives 3 as remainder then
    // minimum 'x' will be 'k-1'
    else if (k % 4 == 3)
        ans = k - 1;
 
    // else it is not possible to
    // get k for any value of x
    else
        ans = -1;
 
    return ans;
}
 
// Driver code
public static void main (String[] args)
{
    // let the given number be 7
    int k = 7;
     
    int res = findN(k);
    if (res == -1)
        System.out.println("Not possible");
    else
        System.out.println(res);
}
}
 
// This code is contributed
// by inder_verma


Python3
# Python3 implementation of
# above approach
 
# Function to find the value of N
def findN(k) :
 
    # handling case for '0'
    if (k == 0) :
        ans = 3
 
    # handling case for '1'
    if (k == 1) :
        ans = 1
 
    # when number is completely
    # divided by 4 then minimum
    # 'x' will be 'k'
    elif (k % 4 == 0) :
        ans = k
 
    # when number divided by 4
    # gives 3 as remainder then
    # minimum 'x' will be 'k-1'
    elif (k % 4 == 3) :
        ans = k - 1
 
    # else it is not possible to 
    # get k for any value of x
    else:
        ans = -1
 
    return ans
 
# Driver code
 
# let the given number be 7
k = 7
 
res = findN(k)
if (res == -1):
    print("Not possible")
else:
    print(res)
 
# This code is contributed
# by Smitha


C#
// C# implementation of
// above approach
using System;
 
class GFG
{
 
// Function to find the
// value of N
static int findN(int k)
{
     
    // variable to store
    // the result
    int ans;
 
    // handling case for '0'
    if (k == 0)
        ans = 3;
 
    // handling case for '1'
    if (k == 1)
        ans = 1;
 
    // when number is completely
    // divided by 4 then minimum
    // 'x' will be 'k'
    else if (k % 4 == 0)
        ans = k;
 
    // when number divided by 4
    // gives 3 as remainder then
    // minimum 'x' will be 'k-1'
    else if (k % 4 == 3)
        ans = k - 1;
 
    // else it is not possible to
    // get k for any value of x
    else
        ans = -1;
 
    return ans;
}
 
// Driver code
public static void Main ()
{
    // let the given number be 7
    int k = 7;
     
    int res = findN(k);
    if (res == -1)
        Console.WriteLine("Not possible");
    else
        Console.WriteLine(res);
}
}
 
// This code is contributed
// by inder_verma


PHP


Javascript


输出:
6

这是如何运作的?
当我们对数字进行XOR运算时,在4的倍数之前得到0作为XOR值。这在4的倍数之前不断重复。

Number Binary-Repr  XOR-from-1-to-n
1         1           [0001]
2        10           [0011]
3        11           [0000]  <----- We get a 0
4       100           [0100]  <----- Equals to n
5       101           [0001]
6       110           [0111]
7       111           [0000]  <----- We get 0
8      1000           [1000]  <----- Equals to n
9      1001           [0001]
10     1010           [1011]
11     1011           [0000] <------ We get 0
12     1100           [1100] <------ Equals to n