C++で指定範囲内のMで割り切れる数を数える方法
3つの整数 A、B、M が与えられます。A と B は数値の範囲 [A, B] を定義し、目的はこの範囲内に存在する M で割り切れる数の個数を求めることです。
基本的な考え方は、i = A から順に最初の M の倍数まで走査し、i % M == 0 が成立するたびにカウントを増やしていくというものです。その後、i ≤ B である限り i を増加させながら同様の判定を繰り返します。
具体例で確認してみましょう。
入力例
A=11, B=20, M=5
出力
指定範囲内でMで割り切れる数の個数: 2
説明
範囲 [11, 20] 内で 5 で割り切れる数は 15 と 20 のみです。したがって、答えは 2 となります。
入力例
A=20, B=50, M=11
出力
指定範囲内でMで割り切れる数の個数: 3
説明
範囲 [20, 50] 内で 11 で割り切れる数は 22、33、44 のみです。したがって、答えは 3 となります。
プログラムで使用するアプローチ
- A、B、M を整数として受け取ります。
- 関数 divisiblebyM(int a, int b, int m) は A、B、M を引数として受け取り、範囲 [A, B] 内で M で割り切れる数の個数を返します。
- カウント変数を 0 で初期化します。
- for ループを使用して、i = A から i = B まで 1 ずつ増加させながら走査します。
- i % m == 0 が成立する場合、カウントを 1 増やします。
- ループ終了後、count には範囲 [A, B] 内で M で割り切れる数の個数が格納されています。
- count を結果として返します。
サンプルコード
// 指定範囲内でMで割り切れる数を数えるプログラム
#include <bits/stdc++.h>
using namespace std;
int divisiblebyM(int a, int b, int m){
int count = 0;
// AからBまでループを実行し、
// 各数値がMで割り切れるかどうかを判定します。
for (int i = a; i <= b; i++){
if (i % m == 0){
count++;
}
}
return count;
}
int main(){
// AとBは範囲を定義し、Mは除数です
int A = 3, B = 15, M = 4;
cout<<"指定範囲内でMで割り切れる数:"<<divisiblebyM(A, B, M) << endl;
return 0;
}出力
指定範囲内でMで割り切れる数:3
-
C++で指定された長さの連続する合成数の範囲を求める方法
正整数 n が与えられたとき、「範囲内のすべての数が合成数であり、かつ範囲の長さがちょうど n となる」ような正整数の範囲を求める問題を考えます。条件を満たす範囲が複数存在する場合は、そのうちのどれか1つを出力すれば構いません。なお、合成数(composite number)とは「1 とその数自身以外に、少なくとも1つの約数を持つ数」のことです。アルゴリズムの考え方範囲の長さが n である以上、先頭の数を a とすると、範囲内の残りの数は a + 1, a + 2, …, a + n − 1 となり、これらがすべて合成数でなければなりません。ここで役立つのが階乗(factorial)の性質です
-
C++でnCrが指定された素数で割り切れるかどうかを判定する方法
3つの変数 N、R、P があるとします。N と R から二項係数 NCR を求め、P は素数とします。このとき、NCR が P で割り切れるかどうかを判定するのが本記事の目的です。例えば、N = 7、R = 2、P = 3 の場合、7C2 = 21 となり、21 は 3 で割り切れるため、結果は true となります。二項係数は一般的に次の式で表されます。NCR = N! / (R! × (N − R)!)ここでルジャンドルの定理(Legendres Formula)を活用します。この定理を使うと、N!、R!、(N − R)! のそれぞれを割り切る素数 P の最大のべき乗(指数)を求めることが