2024年度「プログラミング言語1」「プログラミング言語演習」のページ

練習問題

2024年5月2日出題

    1. 1から99までの正整数に対して、コラッツ予想の手続きで1にたどり着くまでの総ステップ数、3倍して1を足す回数、2で割る回数の表を出力するプログラムを書け。

      ステップ数
      最初の数総ステップ数2で割る回数3倍して1を足す回数
      1000
      2101
      3725
      4202
      5514
      6826
      716511
      8303
      919613
      10615
      1114410
      12927
      13927
      1417512
      1517512
      16404
      171239
      1820614
      1920614
      20716
      21716
      2215411
      2315411
      241028
      2523716
      261028
      271114170
      2818513
      2918513
      3018513
      311063967
      32505
      3326818
      3413310
      3513310
      3621615
      3721615
      3821615
      39341123
      40817
      411094069
      42817
      4329920
      4416412
      4516412
      4616412
      471043866
      481129
      4924717
      5024717
      5124717
      521129
      531129
      541124171
      551124171
      5619514
      57321022
      5819514
      59321022
      6019514
      6119514
      621073968
      631073968
      64606
      6527819
      6627819
      6727819
      6814311
      6914311
      7014311
      711023765
      7222616
      731154273
      7422616
      7514311
      7622616
      7722616
      78351124
      79351124
      80918
      8122616
      821104070
      831104070
      84918
      85918
      8630921
      8730921
      8817413
      8930921
      9017413
      91923359
      9217413
      9317413
      941053867
      951053867
      9612210
      971184375
      9825718
      9925718
    1. 正整数 n の約数の総和を f(n) とする。たとえば、 28 の約数は 1, 2, 4, 7, 14, 28 の6個なので、 f ( 28 ) = 1 + 2 + 4 + 7 + 14 + 28 = 56 である。

      正整数 n を入力して、 f(n) を出力するプログラムを書け。

    2. 正整数 n の約数の個数を f(n) とする。たとえば、 28 の約数は 1, 2, 4, 7, 14, 28 の6個なので、 f ( 28 ) = 6 である。

      正整数 n を入力して、 f(n) を出力するプログラムを書け。

  1. 浮動小数点数 a と整数 n をこの順に入力し、以下の計算をして結果を出力するプログラムを書け。ただし、入力値が条件に合わない場合は、プログラムは何も出力せずに終了せよ。なお、出力は小数点以下8桁で ?.????????e±?? の形式(printfで %.8e を使うと良い)で行うこと。

    1. (二次元) a > 0 かつ n 3 のとき、辺の長さが a の正n角形に対して、以下の四つを計算して出力するプログラムを書け。

      • 内接円の半径
      • 外接円の半径
      • 周長が等しい円の半径
      • 面積が等しい円の半径
    2. (三次元) a > 0 かつ n { 4 , 6 , 8 , 12 , 20 } のとき、辺の長さが a の正n面体に対して、以下の四つを計算して出力するプログラムを書け。

      • 内接球の半径
      • 外接球の半径
      • 表面積が等しい球の半径
      • 体積が等しい球の半径
    3. (四次元) a > 0 かつ n { 5 , 8 , 16 , 24 , 120 , 600 } のとき、辺の長さが a の正n胞体に対して、以下の四つを計算して出力するプログラムを書け。

      • 内接超球の半径
      • 外接超球の半径
      • 表体積が等しい超球の半径
      • 超体積が等しい超球の半径
    注意
    • Cの三角関数はラジアンです。

    • 円周率の近似値として 3.14 は粗すぎです。

      Cで円周率の近似値を計算する方法の一つは、 atan(1)*4 です。 tan ( π 4 ) = 1 を利用して π を計算します。 atan はCの標準関数の一つで、逆正接関数 arctan を計算します。

  2. a b を正の実数とする。 a b の大きい方を a 0 とし、 a b の小さい方を b 0 とする。 a 0 b 0 の算術平均(相加平均)を a 1 とし、 a 0 b 0 の幾何平均(相乗平均)を b 1 とする。 a 1 b 1 の算術平均を a 2 とし、 a 1 b 1 の幾何平均を b 2 とする。 a 2 b 2 の算術平均を a 3 とし、 a 2 b 2 の幾何平均を b 3 とする。 以下、これを無限に繰り返す。 すなわち、数列 a n b n を以下の漸化式で定義する。 a 0 = max { a , b } b 0 = min { a , b } a n + 1 = a n + b n 2 b n + 1 = a n b n

    このとき、数列 a n b n は同じ値に収束することが知られている。共通の極限値を a b 算術幾何平均と呼ぶ。

    1. 二つの浮動小数点数 a b を入力して、以下のように定める m m m を出力するプログラムを書け。 a b の算術幾何平均を m とする。 a m の算術幾何平均を m とする。 m b の算術幾何平均を m とする。

      入力は a b も正であると仮定して良い。出力は小数点以下12桁の小数表示で行い、1行に空白区切りで三つの数を上記の順で並べること。

    ヒント0

    目標誤差 ε を事前に決めておいて、 a n b n < ε となった時点で計算を打ち切れば良い。なお、目標誤差 ε の決め方には『入門書のようなもの(仮)』§1.5.1 にある浮動小数点数の精度の説明が参考になるかもしれない。

    ヒント1

    a > b のとき、 n 1 0 < a n b n < a b 2 n が成り立つことが、証明できる。すなわち、算術平均の計算と幾何平均の計算を n 回繰り返せば、算術幾何平均との誤差は ( a b ) 2 n 未満にできる。

    この事実は、目標誤差以下を達成するために十分な繰り返し回数を事前にすることに利用できる。すなわち、 a n b n の値を毎回評価して十分小さくなったら計算を打ち切るのではなく、事前に見積もった回数だけ繰り返す形でプログラムを書くことができる。 目標誤差が ε の場合、不等式 a b 2 n ε を解けば十分な繰り返し回数がわかる。すなわち、繰り返し回数 n n log 2 a b ε をみたせば良い。

    計算例
    abmmm
    1.0000000000002.0000000000001.4567910310471.2176622016721.717641883408
    2.0000000000003.0000000000002.4746804362362.2310235984992.731021157480
    3.0000000000007.0000000000004.7890135831413.8422710247055.842092968071

奈良女子大学生活環境学部文化情報学科生活情報通信科学コース