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 の問題を紹介していきます。