C++で指定した2つの数の累乗の和として表せるすべての整数を出力する方法
問題の概要
この問題では、2つの数 a と b、および整数 bound が与えられます。そのうえで、bound 以下の値のうち、a と b の累乗の和として表せるすべての値を出力することが求められます。
数式で表すと、以下の条件を満たす値をすべて求めることになります。
Bound >= ai + bj
問題を理解するための例
入力: a=2, b=3, bound=8
出力: 2 3 4 5 7
この例では、bound=8 以下で 2i + 3j の形で表せる値は、2(=20+30)、3(=21+30)、4(=20+31)、5(=21+31)、7(=22+31) となります。
解法のアプローチ
この問題を解くには、0 から始まる 2 つの変数 i と j を用いた二重ループ(ネストされたループ)を使用します。
- 外側のループの終了条件:xi >= bound
- 内側のループの終了条件:xi + yj > bound
内側のループの各反復では、xi + yj の値を、該当するすべての値を格納するソート済みコンテナ(set)に追加していきます。そして最後に、コンテナ内のすべての値を出力します。
set を使うメリットは、要素が自動的に昇順にソートされ、重複する値も自動的に排除される点です。これにより、後処理なしで結果をそのまま出力できます。
実装例
上記の解法を実装した C++ プログラムは以下のとおりです。
#include <bits/stdc++.h>
using namespace std;
void powerSum(int x, int y, int bound) {
set<int> sumOfPowers;
vector<int> powY;
int i;
powY.push_back(1);
for (i = y; i < bound; i = i * y)
powY.push_back(i);
i = 0;
while (true) {
int powX = pow(x, i);
if (powX >= bound)
break;
for (auto j = powY.begin(); j != powY.end(); ++j) {
int num = powX + *j;
if (num <= bound)
sumOfPowers.insert(num);
else
break;
}
i++;
}
set<int>::iterator itr;
for (itr = sumOfPowers.begin(); itr != sumOfPowers.end(); itr++) {
cout << *itr << " ";
}
}
int main() {
int x = 2, y = 3, bound = 25;
cout << "Sum of powers of " << x << " and " << y << " less than " << bound << " are :\n";
powerSum(x, y, bound);
return 0;
}コードの解説
このプログラムのポイントは以下のとおりです。
- ベクトル
powYには、y の累乗の値を bound 未満の範囲で事前に計算して格納します。 - 外側の
whileループで x の累乗を 0 乗から順に生成し、bound 以上になった時点で処理を終了します。 - 内側の
forループで、x の累乗と y の各累乗の和を計算し、bound 以下であればsetに挿入します。 setが重複の排除とソートを自動的に行うため、最後に要素を順に出力するだけで結果が得られます。
出力結果
Sum of powers of 2 and 3 less than 25 are −
2 3 4 5 7 9 10 11 13 17 19 25
この出力は、x=2、y=3、bound=25 の場合に、2i + 3j の形で表せる bound 以下のすべての値を昇順に並べたものです。例えば、9 は 23+30=9、25 は 24+32=25 として表せます。
-
C++で葉ノードから距離kにあるすべてのノードを出力する方法
問題概要この問題では、二分木と数値Kが与えられ、葉ノードから距離Kにあるすべてのノードを出力することが求められます。二分木(Binary Tree)とは、各ノードが最大2つの子ノード(1つ・2つ・または0個)を持つ特別な木構造のことです。葉ノード(Leaf Node)とは、二分木の末端に位置するノードを指します。この問題における「葉ノードからの距離」とは、葉ノードよりも上位のレベルに位置するノードを意味します。たとえば、レベル4にある葉ノードから距離2のノードは、レベル2に存在することになります。具体例で理解しよう次の図のような二分木を例に考えてみましょう。K = 2 の場合、出力:6 9解法
-
C++で2つの数値を加算するプログラムの書き方【サンプルコード付き】
加算(足し算)は、最も基本的な算術演算の一つです。2つの数値を加算するプログラムは、指定された2つの数値の合計を計算し、その結果を画面に表示します。この記事では、C++で2つの数値を加算する方法を、変数を使った基本例と配列を使った応用例の2パターンに分けて解説します。例1:変数を使って2つの数値を加算するまずは、最もシンプルな方法です。2つの整数型変数を用意し、その合計を別の変数に格納して出力します。#include <iostream> using namespace std; int main() { int num1 = 15, num2 = 10, sum;