C++で学ぶ再帰処理:N未満の数値から「1」と「3」のみで構成される数をすべて出力する方法
概要
正の整数値が格納された整数変数Nが与えられます。この記事の課題は、与えられた値N未満の数値のうち、1、3、またはその両方のみで構成されるすべての数値を、再帰処理を用いて出力することです。
入出力シナリオの例
入力 − int num = 40
出力 − N未満の数値のうち、1または3のみで構成される数値は次のとおり: 33 31 13 11 3 1
説明 − 変数numには正の整数値40が格納されています。1と3(またはその両方)のみで構成される数値を再帰的に探索すると、40未満の該当する数値は1、3、11、13、31、33であることが分かります。
入力 − int num = 5
出力 − N未満の数値のうち、1または3のみで構成される数値は次のとおり: 3 1
説明 − 変数numには正の整数値5が格納されています。1、3、またはその両方のみで構成される数値のうち、5未満のものは1と3だけです。
入力 − int num = 1
出力 − 不正な入力(Wrong Input)
説明 − 変数numには正の整数値1が格納されています。1未満の非負整数は0のみですが、0は条件を満たさないため、該当する数値は存在しません。したがって、出力は不正な入力となります。
プログラムで使用するアプローチ
整数変数numを入力として受け取り、その値を引数として関数Recursive_Numbers(num)に渡します。
関数Recursive_Numbers(num)の内部では、以下の手順で処理を行います。
bool型の変数checkを宣言し、1(true)で初期化します。
numが0より大きい場合、whileループを開始します。ループは「temp > 0 かつ check == 1」の間継続され、変数digitにtemp % 10(最下位桁の値)を代入します。
digitが1でも3でもない場合、checkを0(false)に設定します。その後、temp = temp / 10として上位の桁へ処理を進めます。
checkが1のまま残っていれば、そのnumは条件を満たすため出力します。
最後にRecursive_Numbers(num − 1)を再帰的に呼び出し、より小さい数値に対して同じ判定を繰り返します。
このアルゴリズムの計算量は、Nから1まで各数値について桁ごとの判定を行うため、おおよそO(N × 桁数)となります。
コード例
#include <iostream>
using namespace std;
void Recursive_Numbers(int num){
bool check = 1;
int temp = num;
if(num > 0){
while(temp > 0 && check == 1){
int digit = temp % 10;
if (digit != 1 && digit != 3){
check = 0;
}
temp = temp / 10;
}
if(check == 1){
cout<< num << " ";
}
Recursive_Numbers(num - 1);
}
}
int main(){
int num = 40;
if(num <= 1){
cout<<"Wrong input";
}
else{
cout<<"Recursive program to print all numbers less than N which consist of digits 1 or 3 only are: ";
Recursive_Numbers(num);
}
return 0;
}
出力結果
上記のコードを実行すると、以下の出力が生成されます。
Recursive program to print all numbers less than N which consist of digits 1 or 3 only are: 33 31
13 11 3 1
-
C++で最小ヒープから値x未満のすべてのノードを出力する方法
この問題では、最小ヒープ(Min Heap)と値xが与えられ、xより小さい値を持つすべてのノードを出力することが求められます。最小ヒープとは、すべての親ノードがその子ノードの値以下となる特殊な二分木です。この性質により、根(ルート)には常にヒープ内の最小値が格納されます。具体例を使って問題を理解しましょう。X = 45出力 − 2 4 7 10 17 22 33 34この問題を解くには、最小ヒープ全体を先行順トラバーサル(前順走査)で探索し、与えられた値xより小さい値を持つノードのみを出力します。アルゴリズムのポイント最小ヒープでは親ノードの値が必ず子ノード以下であるため、あるノードの値がx以
-
Pythonで完全平方数かつ桁の合計が10未満の数を範囲内から検索する方法
指定した範囲の中から、「完全平方数(ある整数の2乗になっている数)」であり、かつ「各桁の数字の合計が10未満」である数値をすべて検索したい場合、Pythonではリスト内包表記を使うことで簡潔に実装できます。本記事では、その具体的なコード例と動作の仕組みをわかりやすく解説します。サンプルコードlower_limit = int(input(下限を入力してください: )) upper_limit = int(input(上限を入力してください: )) my_list = [] my_list = [x for x in range(lower_limit, upper_limit + 1) if