C++で「Nとの差」が「NとのXOR」と等しくなる数の個数を求める
整数 N が与えられたとき、0 以上 N 以下の数の中から「N との差(引き算の結果)」が「N との XOR(排他的論理和)」と一致する数をすべて見つけ、その個数を数えるのがこの記事の目的です。
調べ方はシンプルで、i を 0 から N まで順に走査し、各 i に対して (N − i) == (i ^ N) が成立する場合にカウントを 1 増やしていきます。
具体例で確認してみましょう。
入力: N = 6
出力: Nとの差がNとのXORと等しい数の個数: 4
説明: 該当する数は 0、2、4、6 の 4 つです。
入力: N = 20
出力: Nとの差がNとのXORと等しい数の個数: 4
説明: 該当する数は 0、4、16、20 の 4 つです。
プログラムで使用しているアプローチ
- 整数 N を入力として受け取ります。
- 関数 diffisXOR(int n) は n を受け取り、「n との差が n との XOR に等しい数」の個数を返します。
- カウント変数 count の初期値は 0 とします。
- i を 0 から n まで順に走査します。
- (n − i) == (i ^ n) が成立した場合は count をインクリメントします。
- for ループが終了した時点で count に求める結果が格納されています。
- count を返し、結果を出力します。
コード例
#include <bits/stdc++.h>
#include <math.h>
using namespace std;
int diffisXOR(int n){
int count = 0;
for (int i = 0; i <= n; i++){
if((n-i)==(i^n))
{ count++; }
}
return count;
}
int main(){
int N = 15;
int nums = diffisXOR(N);
cout << endl << "Nとの差がNとのXORと等しい数の個数: " << nums;
return 0;
}出力
上記のコードを実行すると、次のような出力が得られます。
Nとの差がNとのXORと等しい数の個数: 16
N = 15 は 2 進数で「1111」と表されます。このため 0 から 15 までのすべての数 i について (15 − i) == (i ^ 15) が成立し、該当する数は全部で 16 個になります。
-
【C++】N以下の数と素数の個数との差がK以上となる数の個数を求めるアルゴリズム
2つの整数 N と K が与えられます。目的は、以下の条件を両方とも満たす数の個数を求めることです。 その数が N 以下であること |その数 − 素数の個数| ≥ K であること(ここで「素数の個数」とは、その数以下に存在する素数の総数を指します) 具体例 入力 N = 5, K = 2 出力 N以下の数のうち、それまでの素数の個数との差がK以上となる数は: 2個 説明 条件を満たす数は次の2つです: 5(5−2≥2)と 4(4−2≥2) 入力 N = 10, K = 6 出力 N以下の数のうち、それまでの素数の個数との差がK以上となる数は: 1個 説明 条件を満たす数は次の1つです:
-
C++でマンハッタン距離と等しい距離を持つパスの数を求める方法
2次元座標系上の2つの点 (x1, y1) と (x2, y2) を表す変数 x1、x2、y1、y2 が与えられます。この記事の目的は、これら2点間のマンハッタン距離と等しい距離を持つすべてのパスの総数を求めることです。 マンハッタン距離とは 2点 (x1, y1) と (x2, y2) の間のマンハッタン距離は、次の式で定義されます。 MD = |x1 − x2| + |y1 − y2| ここで、A = |x1 − x2|、B = |y1 − y2| とおきます。 マンハッタン距離と等しい距離を持つすべてのパスは、合計 (A + B) 本の移動で構成されます。そのうち A 本が水平方向の移動