2つの数のXOR合計が最小になる値を求めるC++プログラム
2つの数 a と b が与えられたとき、ある値 x を選んで (a XOR x) + (b XOR x) の最小値を求めることを考えます。
たとえば、入力が a = 6、b = 12 の場合、出力は 10 になります。x = 4 を選ぶと、(6 XOR 4) + (12 XOR 4) = 2 + 8 = 10 となるからです。
考え方
各ビットの位置ごとに考えてみましょう。
- a と b のビットが同じ(両方とも0、または両方とも1)であれば、x のそのビットを同じ値にすることで、両方のXOR結果はその桁で0になります。
- a と b のビットが異なる場合は、x をどのように選んでも、必ずどちらか一方がその桁で1になります。
したがって、最小値は単純に a XOR b に等しくなります。これが答えです。
アルゴリズム
return a XOR b
C++による実装例
理解を深めるために、以下の実装を見てみましょう。
#include<bits/stdc++.h>
using namespace std;
int solve(int a, int b){
return (a^b);
}
int main(){
int a = 6;
int b = 12;
cout << solve(a, b) << endl;
}入力
6, 12
出力
10
まとめ
この問題のポイントは、x を工夫して選んでも a と b のビットが異なる桁では必ず1が残るという点です。そのため、複雑な探索を行う必要はなく、(a XOR x) + (b XOR x) の最小値は常に a XOR b であることが証明できます。計算量は O(1) と非常に効率的です。
-
C++で数の奇数の約数(奇因子)の合計を求めるプログラム
正の整数が与えられたとき、その数の奇数の約数(奇因子)をすべて求め、それらの合計を計算するのが本プログラムの目的です。 例 入力: number = 20 出力: 奇数の約数の合計は: 6 入力: number = 18 出力: 奇数の約数の合計は: 13 例えば number = 20 の場合、約数は 1, 2, 4, 5, 10, 20 ですが、このうち奇数は 1 と 5 のみです。したがって、結果 = 1 + 5 = 6 となります。 プログラムで使用するアプローチ 奇数の約数の合計を計算する対象の数を入力する 偶数の約数を除外するため、まず数を2で割り切れる限り2で割り続け、奇数の部
-
Pythonで最小グループの合計が最大になるようリストをk個に分割する方法
問題概要数値のリスト nums と整数 k が与えられたとします。このリストを「連続する要素からなる」k個のグループに分割することを考えます。ここで「最小グループ」とは、各グループの合計値の中で最も小さいものを持つグループのことです。求めたいのは、その最小グループの合計値が取りうる最大値です。例として、nums = [2, 6, 4, 5, 8]、k = 3 の場合を見てみましょう。リストを [2, 6]、[4, 5]、[8] の3つのグループに分割すると、それぞれの合計は 8、9、8 となり、最小グループの合計は 8 になります。どのように分割しても最小グループの合計が 8 を超えることはで