C++で指定した範囲内にある2つの数値の公倍数(グレータイル)の個数を求める方法
問題概要
2つの整数 A と B、および数値の範囲を定義する START と END が与えられます。A 番目のタイルには白いペンキが、B 番目のタイルには黒いペンキが塗られています。そして、白と黒の両方のペンキが塗られたタイルは灰色(グレー)になるとします。
このとき、START から END の範囲内に存在する「グレーのタイル」、つまり A と B の両方の公倍数となっている数の総数を求めることがゴールです。
解き方は非常にシンプルです。START から END までの数値を順番に走査し、それぞれの数が A と B の両方の倍数であるかを判定します。条件を満たしていればカウントを1ずつ増やしていきます。
入力例・出力例
入力1
START=10 END=20 A=3 B=6
出力1
Common multiples of A and B ( grey tiles ): 2
説明: 範囲内では 12 と 18 が 3 と 6 の両方の倍数(公倍数)に該当するため、答えは 2 となります。
入力2
START=1 END=100 A=10 B=11
出力2
Common multiples of A and B ( grey tiles ): 0
説明: 10 と 11 は互いに素であるため、範囲内に共通の倍数は存在しません。
アプローチの手順
範囲を表す整数 START と END を受け取ります。
対象となる2つの整数 A と B を受け取ります。
関数 countGrey(int start, int end, int a, int b) が範囲と a、b を引数として受け取り、a と b の両方の倍数の個数を返します。
該当する数を数えるための変数 count を 0 で初期化します。
for ループを使って i = start から i = end まで順に走査します。
i % a == 0 かつ i % b == 0 が成り立てば、「i」は a と b の両方の倍数(タイルがグレー)です。
すべてのループが終わった時点で、count には a と b の公倍数の総数が格納されています。
最後に count を結果として返します。
C++サンプルコード
#include <bits/stdc++.h>
using namespace std;
int countGrey(int start, int end, int a, int b){
int count = 0;
for (int i = start; i <= end; i++){
if(i%a==0 && i%b==0) // タイルはグレー
{ count++; }
}
return count;
}
int main(){
int START =10, END = 30;
int A=4, B=3;
cout <<"Common multiples of A and B ( grey tiles ): "<<
countGrey(START,END, A, B);
return 0;
}実行結果
上記のコードを実行すると、次の出力が得られます。
Common multiples of A and B ( grey tiles ): 2
この例では、範囲 10〜30 の中で 4 と 3 の両方の倍数となるのは 12 と 24 の2つであるため、結果は 2 となります。
-
C++で最小の約数がKとなる範囲内の数値を数える方法
本チュートリアルでは、指定された範囲内にある数値のうち、「最小の約数(最小の素因数)」が K と一致するものの個数を求めるC++プログラムについて解説します。 問題の概要 範囲 [a, b] と整数 K が与えられたとき、この範囲に含まれる数値の中で「最小の約数が K であるもの」を数えるのが目的です。 ある数 n の最小の約数が K になるためには、次の2つの条件を満たす必要があります。 n が K で割り切れること 2 以上 K 未満のいずれの整数でも n が割り切れないこと また重要な点として、K が素数でない場合、条件を満たす数は存在しません(合成数が「最小の約数」となることはな
-
【C++】2つの数の公約数の個数を効率的に求めるプログラム
この記事では、2つの数に共通する約数(公約数)がいくつあるかを数える方法を解説します。すべての公約数を実際に列挙するのではなく、その「個数」だけを効率的に求めることが目的です。例えば、12と24という2つの数を考えてみましょう。12と24の公約数は、1、2、3、4、6、12の6つです。したがって、答えは6となります。アルゴリズムの考え方すべての公約数を1つずつ調べるのは非効率です。ここで重要なのが、「2つの数aとbの公約数は、必ずgcd(a, b)(最大公約数)の約数になる」という性質です。つまり、gcd(a, b)の約数の個数を数えれば、それがそのまま公約数の個数になります。さらに、約数の個