学習内容について

どうも、日々眠気と格闘しているしがないITエンジニアです。
本日は、前回に引き続いて
「Modern C++チャレンジ C++17プログラミング力を鍛える100問」の内容を見ていこうと思う。
他の書籍も読み進めてはいるのだが、
Pythonの入門レベルの話をひたすら読み進めているだけなので全くネタに出来ない。。。

導入はここまでにして問題を見ていこう。
前の問題が見たい方は下記のリンクに移動してほしい。

[問題2]最大公約数

与えられた2個の性の整数の最大公約数を計算して出力するプログラムを書きなさい。

ヒント

ヒント

ユークリッドの互除法(ユークリッドのごじょほう、英: Euclidean Algorithm)は、
2 つの自然数の最大公約数を求める手法の一つである。

2 つの自然数 a, b (a ≧ b) について、a の b による剰余を r とすると、
a と b との最大公約数は b と r との最大公約数に等しいという性質が成り立つ。
この性質を利用して、 b を r で割った剰余、 除数 r をその剰余で割った剰余、
と剰余を求める計算を逐次繰り返すと、剰余が 0 になった時の除数が a と b との最大公約数となる。

ユークリッドの互除法 – Wikipedia

解答

解答
unsigned int gcd1(const unsigned int a, const unsigned int b)
{
	return (b == 0) ? a : gcd1(b, a % b);
}

unsigned int gcd2(unsigned int a, unsigned int b)
{
	while (b != 0)
	{
		unsigned int r = a % b;
		a = b;
		b = r;
	}

	return a;
} 

解説

解説

2つ以上の0でない整数の最大公約数(gcd, greatest common divisor)は、
英語でgreatest common factor(gcf)、highest common factor(hcf)、
greatest common measure(gcm)、highest common divisor(hcd)とも呼びますが、
それらすべての数を割り切ることができる最大の正の整数です。
gcdの計算にはいくつかの方法がありますが、ユークリッドの互除法が効率的です。

説明資料

実行結果の例では、a=21、b=6の最大公約数を求めている。
演算時にaにbをセットし、bにa÷bの余りをセットする。
それをbが0になるまで繰り返す。そして、演算終了時にaの値が最大公約数である。
1回目の演算結果では、a=6、b=3になる。
2回目の演算結果では、a=3、b=0になり、繰り返しが終了しaの値である3が最大公約数となる。

実行結果

最後に

 ちなみに筆者は正しい出力結果にはなるものの、無駄な条件、演算が入っていた。
まだまだ、一流の技術者には程遠いようだ。。。

 なお、次の問題については下記リンクに移動してほしい。
第3問目は最小公倍数である。

By ta-boss

One thought on “[C++]Modern C++チャレンジの問題を解く~2問目~”

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です