メインコンテンツへスキップ
  1. 第02講 基本データ型(1/2; リスト,タプル)/

第02講 週次課題

週次課題 リスト イテレータ
目次

課題02-1 乱数値100個の統計
#

難易度 ⭐

1以上,1,000以下の乱数を100個取得してください. それらの合計値,最大値,最小値,平均を求めてください. 出力は,まず,合計,最大値,最小値,平均を1行で出力してください. その次に,得られた乱数値を出力してください. ただし,10個出力するごとに改行を入れてください. ファイル名は,stats_values.py としてください.

import random # 乱数を生成するためのライブラリ

randoms = []

max = # 最大値,
min = # 最小値,
sum = # 合計値の初期値を適切に設定しましょう.

for i in range(100):              # 0〜99 まで繰り返す(100は含まない).
    num = random.randint(1, 1000) # 1 以上 1,000 以下の乱数を生成する(1000を含む).
    # randoms に num を追加する.
    # 最大値,最小値,合計値を更新する.

# 統計値を出力する.

# randoms に格納された乱数値を順に出力する.
# enumerate 関数を使うと,インデックスを取得できる.
# インデックスを10で割ったときの余りが9のときに改行すると良い.
# 数値の右寄せは {:>4} で指定できる(4桁).

出力例
#

乱数ですので,必ずしもこの通りの結果にはなりません.

max: 1000, min: 10, sum: 44298, avg: 442.98
  67  43 751 814  81 954 392  97  20  39
 342 127 323 537  79 760 559 275  80 869
 704 362  73  94 429 617 887 525 827 144
 127 676 866 249  10  55 264 477 340 642
 376 856 275  35 551 492  551000 764 389
 560 556 755  71 464 986 294 957 403 297
 273 784  21 671 642 425 464 312 629 838
 308 154 892  82 773  21  55 332 404 667
  59 560 675 158 580 443 826 732 180 445
 824 144 862 907 742 328 493 279 134 467

フォーマット文字列で変数valueを出力するとき, {value:>4} とすると,valueに代入された値を右寄せ,4桁で表示できます. 左寄せは {value:<4},中央寄せは {value:^4} です. 4 を修正すると,桁数が変わります.

課題02-2 約数の列挙
#

難易度 ⭐⭐

コマンドライン引数で与えられた数値それぞれの約数を調べ,その結果を出力してください. ファイル名は,divisors.py としてください.

import sys   # コマンドライン引数を取得するためのライブラリ

for value in sys.argv[1:]:      # コマンドライン引数を順に処理する.
    num = int(value)            # コマンドライン引数を整数に変換する.
    divisors = []               # 約数を格納するリストを初期化する.
    # 1からnum(を含む)範囲で繰り返す
        # num が i で割り切れるとき divisors に i を追加する.
    print(f"{num}: {divisors}") # num(数値)と divisors(約数一覧)を出力する.

出力例
#

python3 divisors.py 16 201 1045
16: [1, 2, 4, 8, 16]
201: [1, 3, 67, 201]
1045: [1, 5, 11, 19, 55, 95, 209, 1045]

課題02-3 素因数分解
#

難易度 ⭐⭐⭐

コマンドライン引数で与えられた数値それぞれを素因数分解し,その結果を出力してください. ファイル名は,factorizers.py としてください.

import sys

for v in sys.argv[1:]:
    num = int(v) # コマンドライン引数を整数に変換する.
    factors = [] # 素因数を格納するリストを初期化する.
    value = num  # 素因数分解する値を初期化する.
    factor = 2   # 素因数
    # factor が value より小さい間繰り返す.
        # value が factor で割り切れたら
            # factor を factors に追加する.
            # value を factor で割り,value に再代入する.
        # そうでなければ
            # factor を 1 増加させてループを繰り返す.
    # ループ後,value が 1 でない場合
        # value を factors に追加する.

    # 結果を出力する.num を 8桁右寄せで表示する.
    # join は文字列を結合するメソッドで,リストの要素を文字列に変換して,"*" で結合する.
    print(f"{num:>8}: {' * '.join(map(str, factors))}")

出力例
#

      16: 2 * 2 * 2 * 2
      25: 5 * 5
     129: 3 * 43
     401: 401
  103019: 7 * 14717
     121: 11 * 11

アルゴリズム 試し割り法
#

上記の素因数分解のアルゴリズムは,試し割り法と呼ばれるものです. 基本的な考え方は,素因数分解しようとする整数 \(n\) を小さい数値から割り切れるかを調べていく方法です.

詳細は,Wikipediaなどをご覧ください.