C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で%演算子を使わずに3と5の倍数を判定する方法

通常、ある数が3や5の倍数であるかどうかを調べるには、% 演算子(剰余演算子)を使えば簡単に実装できます。しかし、この問題では % 演算子を使用することが禁止されています。

そこで本記事では、+ 演算子(加算)を活用するアプローチを紹介します。考え方はシンプルで、「前の倍数に3または5を足せば次の倍数になる」という性質を利用します。まずは具体例を見てみましょう。

入力例と出力例

入力

15

出力

1
2
3 - Multiple of 3
4
5 - Multiple of 5
6 - Multiple of 3
7
8
9 - Multiple of 3
10 - Multiple of 5
11
12 - Multiple of 3
13
14
15 - Multiple of both 3 and 5

アルゴリズム

  • 判定対象となる数 n を初期化します。
  • 次に現れる 3 の倍数5 の倍数を追跡するための変数を2つ用意します。
  • 初期値はそれぞれ 35 とします。
  • 1 から n まで(両端を含む)を繰り返すループを作成します。
    • 追跡用変数と現在の数を比較し、その数が3の倍数かどうかを判定します。
    • 同様に、5の倍数かどうかも判定します。
    • もし3の倍数なら、追跡変数に3を加算して次の倍数を更新します。5の倍数の場合も同様に5を加算します。
    • 判定結果に応じて、対応するテキストをコンソールに出力します。

C++での実装

以下は、上記のアルゴリズムをC++で実装したコードです。

#include <bits/stdc++.h>
using namespace std;
void findMultiplesOf3And5(int n) {
    int threeMultiple = 3;
    int fiveMultiple = 5;
    for (int i = 1; i <= n; i++) {
        bool _3 = false, _5 = false;
        if (i == threeMultiple) {
            threeMultiple += 3;
            _3 = true;
        }
        if (i == fiveMultiple) {
            fiveMultiple += 5;
            _5 = true;
        }
        if (_3 && _5) {
            cout << "Multiple of both 3 and 5" << endl;
        }else if (_3) {
            cout << "Multiple of 3" << endl;
        }else if (_5) {
            cout << "Multiple of 5" << endl;
        }else {
            cout << i << endl;
        }
    }
}
int main() {
    findMultiplesOf3And5(100);
    return 0;
}

実行結果

上記のコードを実行すると、次のような結果が得られます(n=100の場合)。ここでは冒頭部分のみを抜粋して示します。以降も同じパターンが100まで続きます。

1
2
Multiple of 3
4
Multiple of 5
Multiple of 3
7
8
Multiple of 3
Multiple of 5
11
Multiple of 3
13
14
Multiple of both 3 and 5
16
17
Multiple of 3
19
Multiple of 5
...

ポイントのまとめ

この手法のポイントは、剰余計算を行わずに「次の倍数」を事前に記憶しておくことです。3の倍数は3ずつ、5の倍数は5ずつ増えていくため、加算だけで倍数判定が完結します。計算量はO(n)、追加のメモリは定数個の変数のみで済むため、非常に効率的な方法といえます。なお、15のように3と5の両方の倍数(つまり15の倍数)になる場合は、「Multiple of both 3 and 5」として両方の条件を満たすことを明示しています。

  1. C++のnew/delete演算子を解説!動的メモリ確保と解放の基本

    new演算子とは new演算子は、ヒープ領域に対してメモリの割り当てを要求します。十分な空きメモリが存在する場合、確保したメモリをポインタ変数に結び付け、そのアドレスを返します。 基本構文 pointer_variable = new datatype; 初期値を指定して確保する構文 メモリ確保と同時に初期値を設定することも可能です。 pointer_variable = new datatype(value); メモリブロック(配列)を確保する構文 pointer_variable = new datatype[size]; new演算子のサンプルコード 次の例では、単一の変数用のメモリ、

  2. C++のインクリメント(++)・デクリメント(--)演算子のオーバーロード徹底解説

    C++には、インクリメント(++)とデクリメント(--)という2つの重要な単項演算子が用意されています。これらの演算子は、ユーザー定義クラスに対してオーバーロードすることで、オブジェクトを直感的に操作できるようになります。 次の例では、インクリメント演算子(++)を前置(prefix)と後置(postfix)の両方の使い方に対応させてオーバーロードする方法を解説します。同様の方法で、デクリメント演算子(--)もオーバーロード可能です。 前置と後置の違い 前置演算子(++T)は、値をインクリメントした後の値を返します。一方、後置演算子(T++)は、インクリメントする前の元の値を返してからインクリ