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 <bits/stdc++.h>
using namespace std;
void luckyNumber(int sum) {
int a, b;
a = b = 0;
while (sum > 0) {
if (sum % 7 == 0) {
++b;
sum = sum - 7;
} else
if (sum % 4 == 0) {
++a;
sum = sum - 4;
} else {
++a;
sum = sum - 4;
}
}
cout << "Answer = ";
if (sum < 0) {
cout << "-1\n" << endl;
return;
}
for (int i = 0; i < a; ++i) {
cout << "4";
}
for (int i = 0; i < b; ++i) {
cout << "7";
}
cout << endl;
}
int main() {
int sum = 22;
luckyNumber(sum);
return 0;
}上記のプログラムをコンパイルして実行すると、以下の出力が得られます。
出力
Answer = 4477
処理の流れの解説
sum = 22 の場合、プログラムは次のように動作します。
- 22は7で割り切れないため、4を引いて18にします(4のカウント:1)。
- 18も7で割り切れないため、さらに4を引いて14にします(4のカウント:2)。
- 14は7の倍数なので、7を引いて7にします(7のカウント:1)。
- 残りの7を引いて0にします(7のカウント:2)。
結果として、4が2個・7が2個となり、「4」を先頭に並べた 4477 が出力されます。なお、sumが4と7の組み合わせで表せない場合(たとえば6など)は、sumが負になった時点で -1 を出力して終了します。
-
C++で「x + 桁の合計 = n」を満たす数xを見つける方法
この記事では、ある整数 n が与えられたとき、「x + x の各桁の合計 = n」という条件を満たす数 x を求める問題を解説します。例として、n = 21 の場合を考えてみましょう。このとき答えは x = 15 となります。なぜなら、15 の各桁の合計は 1 + 5 = 6 であり、15 + 6 = 21 となって、与えられた n と一致するからです。解き方のアプローチこの問題はシンプルな方法で解くことができます。1 から n まで順番に数を調べていき、それぞれの数について「その数自身 + 各桁の合計」が n と等しくなるかどうかを確認します。条件を満たす数が見つかった時点で処理を終了し、そ
-
C++で数値の各桁の合計を計算するプログラム
ここでは、C++言語を使用して入力された整数の各桁の合計を計算する方法を紹介します。剰余演算子と整数除算を組み合わせたシンプルなアルゴリズムで実装できます。 プログラム例 #include<iostream> using namespace std; int main() { int x, s = 0; cout << Enter the number : ; cin >> x; while (x != 0) {