C++で強力な整数(Powerful Integers)を求めるアルゴリズムと実装
強力な整数(Powerful Integers)とは
ここに3つの整数「a」「b」「limit」があるとします。この課題では、範囲 [a, limit] に含まれる数のうち、次の形式で表現できる数(強力な整数)をすべて出力します。
a^i + b^j(ただし i >= 0 かつ j >= 0)
具体例
入力:
a = 2 b = 5 limit = 10
出力:
[2, 3, 5, 6, 7, 9]
解説: 各指数 i と j の組み合わせごとに計算すると、以下のようになります。
2^0 + 5^0 = 2 、 2^0 + 5^1 = 6
2^1 + 5^0 = 3 、 2^1 + 5^1 = 7
2^2 + 5^0 = 5 、 2^3 + 5^0 = 9
したがって、limit = 10 以内で表現できる強力な整数は [2, 3, 5, 6, 7, 9] となります。
この問題を解くためのアプローチ
この問題に対する最も基本的な解法は、総当たり(ブルートフォース)方式です。二重ループを使って limit を超えない範囲で各べき乗の組み合わせの和を求め、その結果をリストに追加していきます。
- 3つの整数「a」「b」「limit」を受け取ります。
- 関数 powerfulnumbers(int a, int b, int limit) がこれらの値を引数として受け取り、a^i + b^j(i >= 0、j >= 0)で表されるすべての強力な整数のリストを返します。
- limit までの範囲で二重ループを回し、各反復でべき乗の値を計算してその和を求めます。
- 得られた数が範囲 [a, limit] 内に収まっている場合は、重複を避けるために set(集合)に格納します。
- 最後に set を走査して結果を出力します。
なお、a または b が 1 の場合、べき乗の値が増加しないため無限ループに陥る恐れがあります。サンプルコードでは、このケースを break 文によって適切に処理しています。
C++での実装例
#include <bits/stdc++.h>
using namespace std;
void powerfulNum(int a, int b, int limit) {
set < int > s;
for (int i = 1; i < limit; i *= a) {
for (int j = 1; j < limit; j *= b) {
if (i + j <= limit) {
s.insert(i + j);
} else break;
if (b == 1) break;
}
if (a == 1) break;
}
for (auto it: s) {
cout << it << " ";
}
}
int main() {
int a = 2;
int b = 5;
int limit = 10;
powerfulNum(a, b, limit);
return 0;
}上記のコードを実行すると、次の出力が得られます。
出力
2 3 5 6 7 9
このように、範囲 2〜10 に含まれる強力な整数はすべて [2, 3, 5, 6, 7, 9] となります。set を使用することで重複が自動的に排除され、結果が昇順で出力される点も大きなメリットです。
-
C++で数値文字列を整数に変換する方法
ここでは、C++で数値を表す文字列(数値文字列)を整数型のデータに変換する方法を解説します。この問題は、標準ライブラリに含まれる atoi() 関数を使うことで簡単に解決できます。atoi() は「ASCII to Integer」の略で、文字列を入力として受け取り、それを整数値へと変換して返します。atoi() 関数は <cstdlib> ヘッダに定義されています。使用する際は、このヘッダをインクルードする必要があります。入力:数値文字列 1234 出力:1234アルゴリズムステップ1: 数値を表す文字列を用意する ステップ2: atoi()関数を使って整数に変換する ステップ3
-
Pythonで解く「強力な整数」問題:x^i + y^j の全組み合わせを効率的に列挙する
「強力な整数」とは何か 正の整数 x と y が与えられたとき、ある整数 n が n = xi + yj(i ≥ 0、j ≥ 0)の形で表せるとき、n を強力な整数(Powerful Integer)と呼びます。この記事では、bound 以下の値をもつ強力な整数をすべて列挙するアルゴリズムを、Python の実装例とともに分かりやすく解説します。 たとえば x = 2、y = 3、bound = 10 という入力に対しては、出力は [2, 3, 4, 5, 7, 9, 10] になります。それぞれの値は次のように構成されています。 2 = 20 + 30 3 = 21 + 30 4 = 20