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

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
  1. C++で指定された長さの連続する合成数の範囲を求める方法

    正整数 n が与えられたとき、「範囲内のすべての数が合成数であり、かつ範囲の長さがちょうど n となる」ような正整数の範囲を求める問題を考えます。条件を満たす範囲が複数存在する場合は、そのうちのどれか1つを出力すれば構いません。なお、合成数(composite number)とは「1 とその数自身以外に、少なくとも1つの約数を持つ数」のことです。アルゴリズムの考え方範囲の長さが n である以上、先頭の数を a とすると、範囲内の残りの数は a + 1, a + 2, …, a + n − 1 となり、これらがすべて合成数でなければなりません。ここで役立つのが階乗(factorial)の性質です

  2. 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 の最大のべき乗(指数)を求めることが