C++で数字根がDとなるK桁の数値を出力する方法
この問題では、2つの整数KとDが与えられ、K桁の数値のうち、その数字根(デジタルルート)がDと等しくなるものを出力することが求められます。
数字根とは、数値を構成する各桁の数字を再帰的に加算していき、1桁の数になるまでこの操作を繰り返した結果得られる1桁の値のことです。「デジタルサム(数字和)」とも呼ばれます。
具体例で問題を確認しましょう。
入力: D = 5, K = 6 出力: 500000
解法のアプローチ
この問題は、数値Dの後ろに0を並べるというシンプルな発想で解決できます。つまり、出力する数値は {D000...(0がK-1個)} の形になります。
0をいくつ追加しても各桁の数字の合計は変わらないため、この数値の数字根は必ずDになります。この解法はシンプルでエレガントなうえ、計算量も非常に少なくて済みます。
ただし、D = 0かつK ≠ 1の場合には注意が必要です。K桁(K > 1)の数値の先頭の桁は0にできないため、そのような数値の数字根が0になることはありません。この場合は「-1」を出力して、条件を満たす数値が存在しないことを示します。
実装例
上記の解法を実装したC++プログラムは以下の通りです。
#include <bits/stdc++.h>
using namespace std;
void printKdigitNumber(int k, int d) {
if (d == 0 && k != 1)
cout << "-1";
else {
cout << d;
k--;
while (k--)
cout << "0";
}
}
int main() {
int K=6, D=5;
cout<<K<<" digit number with digital Root = "<<D<<" is : ";
printKdigitNumber(K, D);
return 0;
}出力結果
6 digit number with digital Root = 5 is : 500000
-
C++で括弧の番号(ブラケット番号)を出力する方法
問題概要この問題では、括弧を含む式が与えられ、その括弧の番号列を出力することが求められます。まず具体例を見て、問題の内容をしっかり理解しましょう。例:入力 : ((()())())出力 : 1233442551解説 ― この式には5組の括弧ペアが含まれており、それぞれの括弧が出現した順序に従って番号を出力しています。問題の内容が把握できたところで、次に解決策を考えていきましょう。解法のアプローチこの問題を効率的に解くには、スタックというデータ構造を活用します。具体的には、左括弧「(」の個数を数えるための変数を1つ用意し、スタックで対応する右括弧「)」の情報を管理します。左括弧が出現するたびに通
-
C++で桁の合計がnとなる最小のラッキーナンバー(4と7のみで構成)を求める方法
問題の概要ラッキーナンバーとは、10進表記がラッキーな数字である「4」と「7」のみで構成される正の整数のことです。この問題では、各桁の数字の合計がnと等しくなるような、最小のラッキーナンバーを求めます。例sum = 22 の場合、4 + 4 + 7 + 7 = 22 が成立するため、答えは 4477 となります。アルゴリズムsumが4の倍数であれば、答えはすべて「4」で構成されます。sumが7の倍数であれば、答えはすべて「7」で構成されます。sumが4の倍数でも7の倍数でもない場合は、どちらかの数字を引き続け、sumがもう片方の倍数になるまで減算を行います。実装例(C++)#include &