C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

n XOR n+1がC++で指定されたkと等しくなるような最小数nを見つけます


正の数kがあるとします。 nとn+1のXORがkと同じになるように、正の数nを見つける必要があります。したがって、k =7(111)の場合、出力は3になります。3(011)、3 + 1 =4(100)として、011 XOR 100 =111(7)

考えられるケースは2つあります。 nが偶数であると考えてください。 n=0の最後のビット。次にn+1=1の最後のビット。残りのビットは同じです。したがって、nが奇数の場合、XORは1になり、最後のビットは1になり、n + 1ビットの最後のビットは0になります。ただし、この場合、キャリーによって異なるビットが増えます。キャリーは、最初の0ビットを取得するまで左に伝搬し続けます。したがって、n XOR n+1は2^i -1になります。ここで、iはnの左から最初の0ビットの位置です。したがって、kが2 ^ i – 1の形式である場合、答えはk/2になります。

#include<iostream>
using namespace std;
int findNValue(int k) {
   if (k == 1)
      return 2;
   if (((k + 1) & k) == 0)
      return k / 2;
      return -1;
}
int main() {
   int k = 15;
   cout << "The value of n is: " << findNValue(k);
}

出力

The value of n is: 7

  1. xとその桁の合計がC++で指定されたnと等しくなるような数xを見つけます

    ここで、1つの問題が発生します。ここで、数値nを取得する場合、x +桁の合計xが指定された数値nと同じになるように、xなどの別の値を見つける必要があります。 nの値が21であると仮定します。このプログラムは、15+桁の合計15、つまり15 + 1 + 5 =21=nとして数値x=15を返します。 この問題を解決するには、単純なアプローチに従う必要があります。 1からnまで繰り返し、各繰り返しで、数値とその桁の合計の合計が数値と同じであるかどうかを確認し、停止します。それ以外の場合は続行します。 例 #include<iostream> using namespace std; i

  2. xがC++でyを分割するように、指定された範囲で別個のペア(x​​、y)を見つけます

    ここで、興味深い問題が1つあります。ここで、ペア(x、y)が見つかります。ここで、xとyは範囲内にあるため、l <=x、y <=rであり、ペアには1つのプロパティがあり、xの値はyを除算します。 。利用可能なペアが複数ある場合は、1つだけを選択してください。 下限lと2lの値を取得すれば、O(1)時間でこの問題を解決できます。 y / xの最小値は2である可能性があり、範囲内にさらに大きな値が存在する場合は、2が範囲内になります。また、xを増やすと、2xも増えるため、lと2lは、指定された範囲に入る最小のペアになります。 例 #include<iostream> using na