C++で各桁が素数となる最大の数を求める方法
このチュートリアルでは、C++を使って「n以下の数のうち、すべての桁が素数(2・3・5・7)で構成される最大の数」を求めるプログラムを作成します。
一桁の素数は 2、3、5、7 の4つだけです。そのため、答えとなる数はこれらの数字だけで構成されている必要があります。それでは、問題を解くための手順を見ていきましょう。
解法の手順
- 数値nの各桁を先頭から順に走査するループを作成します。
- 現在の桁が素数でない場合:
- その桁が「2」以下である間、インデックスiを1つずつ減らします(桁の繰り下がり処理)。iが負になった場合は0に戻します。
- 現在のインデックスの値を、元の桁より小さい最大の素数の桁に更新します。
- 次のインデックス以降のすべての桁を「7」(最大の素数の桁)に置き換えます。
- 現在の桁が素数でない場合:
- 処理後の文字列nを返します。
実装例
実際のコードを見てみましょう。
#include <bits/stdc++.h>
using namespace std;
bool isPrime(char c) {
return c == '2' || c == '3' || c == '5' || c == '7';
}
void decrease(string& n, int i) {
if (n[i] <= '2') {
n.erase(i, 1);
n[i] = '7';
}else if (n[i] == '3') {
n[i] = '2';
}else if (n[i] <= '5') {
n[i] = '3';
}else if (n[i] <= '7') {
n[i] = '5';
}else {
n[i] = '7';
}
return;
}
string getPrimeDigitsNumber(string n) {
for (int i = 0; i < n.length(); i++) {
if (!isPrime(n[i])) {
while (n[i] <= '2' && i >= 0) {
i--;
}
if (i < 0) {
i = 0;
}
decrease(n, i);
for (int j = i + 1; j < n.length(); j++) {
n[j] = '7';
}
break;
}
}
return n;
}
int main() {
string n = "7464";
cout << getPrimeDigitsNumber(n) << endl;
return 0;
}
出力結果
上記のコードを実行すると、次の結果が出力されます。
7377
動作の解説
入力「7464」の場合、2番目の桁「4」は素数ではありません。そこで、「4」より小さい最大の素数の桁である「3」に置き換えられ、それ以降の桁はすべて最大の素数の桁「7」に設定されます。この処理により、条件を満たす最大の数「7377」が得られます。
まとめ
本チュートリアルについてご不明な点や質問がある場合は、コメント欄でお気軽にお知らせください。
-
C++で数値の最大の素因数を求める方法
ある整数 x が与えられたとき、その最大の素因数を求めることを考えます。例えば、x = 6 の場合、6 を素因数分解すると 2 × 3 となるため、最大の素因数は 3 です。 この問題は、対象の数を小さい約数から順に割り続けて素因数分解を行い、その過程で現れる素因数のうち最も大きいものを記録していくことで解くことができます。 アルゴリズムの流れ n が偶数である限り 2 で割り続け、素因数として 2 を記録します。 3 から √n までの奇数 i について、n が i で割り切れる限り割り続け、i を素因数として記録します。 ループ終了後も n が 2 より大きければ、残った n 自体が素
-
C++で数値が完全素数(フルプライム)かどうかを判定する方法
完全素数(フルプライム)とは?本記事では、ある数値が「完全素数(フルプライム)」であるかどうかを判定する方法を解説します。完全素数とは、その数値自体が素数であり、かつ各桁の数字もすべて素数である数のことです。例えば、37は2桁とも素数の数字(3と7)で構成され、数値全体も素数であるため、完全素数です。一方、97は数値自体は素数ですが、各桁に9という素数でない数字が含まれているため、完全素数ではありません。判定のアプローチ効率的な判定方法は以下の2段階で行います。まず、素数でない桁が含まれていないかを確認します。各桁の数字は0から9の範囲に収まるため、この範囲で素数となるのは2、3、5、7の4つ