【C++】k-ラフ数(k-ジャグ数)の判定方法をわかりやすく解説
k-ラフ数(k-ジャグ数)とは?
ある整数の最小の素因数が、指定された値 k 以上であるとき、その数は k-ラフ数(k-rough number) または k-ジャグ数(k-jagged number) と呼ばれます。
例えば、75 の素因数は 3、5、5 なので、最小の素因数は 3 です。したがって、75 は「3-ラフ数」ですが、「5-ラフ数」ではありません。
このチュートリアルでは、与えられた数 n が k-ラフ数であるかどうかを判定する C++ プログラムを作成します。
解決の手順
- 数値 n と k を初期化します。
- n の約数となるすべての素数を見つけ、ベクターに格納します。
- ベクターの先頭要素(=最小の素因数)を取得し、k と比較することで、n が k-ラフ数かどうかを判定します。
C++での実装例
それでは、実際のコードを見てみましょう。
#include <bits/stdc++.h>
using namespace std;
// 素数判定関数
bool isPrime(int n) {
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
// n の約数の中から素数をすべて取得する関数
vector<int> getPrimes(int n) {
vector<int> primes;
for (int i = 2; i < n; i++) {
if (n % i == 0 && isPrime(i)) {
primes.push_back(i);
}
}
return primes;
}
// n が k-ラフ数かどうかを判定する関数
bool isRoughNumber(int n, int k) {
vector<int> primes = getPrimes(n);
return primes[0] >= k;
}
int main() {
int n = 75, k = 3;
if (isRoughNumber(n, k)) {
cout << n << " is a " << k << " rough number" << endl;
} else {
cout << n << " is not a " << k << " rough number" << endl;
}
return 0;
}
実行結果
上記のプログラムを実行すると、次のような出力が得られます。
75 is a 3 rough number
75 の最小の素因数は 3 であり、これは k = 3 以上であるため、「3-ラフ数」と正しく判定されています。
まとめ:さらに効率よくするには
実は、すべての素因数をベクターに格納する必要はありません。n の最小の素因数だけを見つけ、それを k と比較すれば十分です。2 から順に n を割り切れる数を探し、最初に見つかった時点で判定を返せばよいため、メモリ使用量と計算時間の両方を大幅に削減できます。
ぜひ、この最適化されたアプローチで自分でも実装してみてください。
本チュートリアルについてご不明な点やご質問がある場合は、コメント欄でお気軽にお知らせください。
-
C++で可変数の引数(可変長引数)を扱う方法
プログラミングをしていると、引数の個数があらかじめ決まっていない関数、つまり呼び出しのたびに異なる数のパラメータを受け取れる関数が必要になる場面があります。C/C++ではこのような状況に対応する仕組みが用意されており、要件に応じて可変個の引数を受け取る関数を自由に定義できます。以下に、そのような関数の定義例を示します。 int func(int, ... ) { . . . } int main() { func(1, 2, 3); func(1, 2, 3, 4); } 注目すべきは、関数func()の最後の引数が省略記号(ピリオド3つの「...」)になってい
-
C++のCHAR_BITとは?意味と使い方を解説
CHAR_BITは、char型が持つビット数を表すマクロです。C++では「limits.h」ヘッダーファイル(C++では<climits>)で宣言されており、一般的な環境では1バイトが8ビットであることを示します。このマクロを利用することで、移植性の高いコードを書くことができます。環境に依存せずにchar型のビット数を取得できるため、ビット演算やデータサイズの計算に役立ちます。CHAR_BITの使用例以下は、C++でCHAR_BITを使用したサンプルコードです。CHAR_BITとsizeofを組み合わせてint型の全ビット数を求め、整数値を2進数形式で出力しています。#includ