AIZU ONLINE JUDGE

AOJ ITP1 3_D(How Many Divisors?)を解く

AOJ_ITP1_3_D

Aizu Online Judge(AOJ)が提供している「プログラミング入門」(ITP1)の3_D問題をC++とPython で解いてみました。

ITP1 のトピック3では、繰り返し処理を学びます。「条件に従って処理を繰り返し、反復処理を行う構造文を学習します。」とあります。この学習コースを通じて、Python に慣れていきたいと考えています。

問題(3_D: How Many Divisors?)

問題はリンク先をご覧ください。

AOJ ITP1 3_D問題:How Many Divisors?

繰り返し、条件判断を行う応用として、約数となっている数の個数を求めるプログラムを作ります。

解答案

C++ プログラム例(ITP1 3_D)

3つの整数 a、b、c を読み込み、$a \leqq n \leqq c$ を満たす $n$ に対して、$c$ の約数になっている個数を求めます。

#include <iostream>

using namespace std;

int main()
{
	int a, b, c;
	int divisor = 0;

	cin >> a >> b >> c;

	for (int i = a; i <= b; ++i) {
		if ((c % i) == 0) {
			++divisor;
		}
	}

	cout << divisor << endl;

	return 0;
}

ループ変数が明確なため、for 文を使いました。

Python プログラム例(ITP1 3_D)

まず、上の C++ に近い Python のプログラムを紹介します。

a, b, c = map(int, input().split())
divisor = 0
for i in range(a, b + 1):
    if c % i == 0:
        divisor += 1
print(divisor)

Python はリストを定義する構文が豊富で、次のようにも書けます。

a, b, c = map(int, input().split())
divisors = [i for i in range(a, b + 1) if c % i == 0]
print(len(divisors))

条件を満たす約数をリスト divisors に格納して、リストのサイズを出力しています。

関数 len は、リストを引数にとるため、変数を経由しない次の書き方ができます。

a, b, c = map(int, input().split())
print(len([i for i in range(a, b + 1) if c % i == 0]))

このプログラムが、一番 Python らしい書き方かもしれません。

上記プログラムは、すべて AOJ で「AC(Accepted=正解)」と判定されます。

最後に

ITP1から、繰り返しに関係する話題を4回ほど紹介しました。今回は、同じことをなるべく Python らしい書き方ができないか工夫して、3例ほど紹介しました。

引き続き、ITP1 の問題を紹介していきます。

COMMENT

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

CAPTCHA