C++で3または7の倍数の個数を求める方法
数値 n が与えられたとき、n までに含まれる 3 または 7 の倍数の個数を求める問題を考えます。まずは具体例を見てみましょう。
入出力の例
入力
100
出力
43
100 までには、3 または 7 の倍数が合計 43 個存在します。
アルゴリズム
数値 n を初期化します。
カウント用の変数を 0 で初期化します。
3 から n まで繰り返すループを作成します。
現在の数値が 3 または 7 で割り切れる場合は、カウントを 1 増やします。
C++での実装
以下は、上記のアルゴリズムを C++ で実装したコードです。
#include <bits/stdc++.h>
using namespace std;
int getMultiplesCount(int n) {
int count = 0;
for (int i = 3; i <= n; i++) {
if (i % 3 == 0 || i % 7 == 0) {
count++;
}
}
return count;
}
int main() {
cout << getMultiplesCount(100) << endl;
}
実行結果
上記のコードを実行すると、次の出力が得られます。
43
補足:包除原理による高速化
ループを使わずに、包除原理を利用すれば答えを直接計算することもできます。n までの 3 の倍数は ⌊n/3⌋ 個、7 の倍数は ⌊n/7⌋ 個あり、両方に重複して含まれる 21 の倍数は ⌊n/21⌋ 個です。したがって、答えは次の式で求められます。
⌊n/3⌋ + ⌊n/7⌋ − ⌊n/21⌋
n = 100 の場合、33 + 14 − 4 = 43 となり、先ほどの実行結果と一致します。この方法なら O(1) の時間で計算できるため、n が非常に大きい場合にも効率的に対応できます。
-
C++で平面内に形成できる平行四辺形の数を数えるアルゴリズム
本記事の課題は、平面上に与えられた点集合から形成できる平行四辺形の個数を求めることです。平行四辺形とは、四角形の対辺が互いに平行であり、それに伴って対角も等しくなる四角形のことを指します。 入力 − int a[] = {0, 2, 5, 5, 2, 5, 2, 5, 2} int b[] = {0, 0, 1, 4, 3, 8, 7, 11, 10} 出力 − 平面内の平行四辺形の数 − 3 説明 − (x, y) 座標の点が与えられており、これらの点を組み合わせると、図のように 3 つの平行四辺形を形成できます。 入力 − a[] = {0, 3, 1, 4, 1, 5} b[] =
-
【C++】長方形に含まれる正方形の総数を求めるアルゴリズムと実装
縦の長さL、横の幅B(L≥B)の長方形が与えられたとします。この記事では、L×Bの長方形の中にいくつの正方形が含まれているかを効率的に求める方法を解説します。 上の図は3×2の長方形の例です。この長方形には、2×2の正方形が2個、1×1の正方形が6個含まれています。 合計:6+2=8個 規則性を見つける まず、正方形だけで構成されたB×Bの図形について考えてみましょう。 サイズL×Bの長方形には、必ずL×B個の1×1の正方形が含まれます。 含まれる最大の正方形のサイズはB×Bです。 L=B=1の場合:正方形の数=1 L=B=2の場合:正方形の数=1+4=5(2×2が1個、1×1が4個) L