練習 [14] 後半の復習(1/5)

練習 1(提出プログラム名:p1401a.c)

まず,このプログラム(p1401a.c)をダウンロードしなさい.
p1401a.c では「2 の平方根(√2)」を整数の比 n/d で近似しようとしている.
具体的には,分母に相当する d が与えられた時
n/d最も√2 に近くなる n を以下のアルゴリズムで見つけ出そうとしている.
なお,プログラムではこのアルゴリズムを get_numerator という名前の関数で
実装しようとしているが未完成となっている.
この関数を完成させなさい.ただし,main 関数の内容は一切変更しないこと.

この問題では n, d とも正の整数であると仮定してプログラムを作ってよい.
なお,sqrt といった数学計算用の標準ライブラリ関数を使ってはいけません.

【実装すべきアルゴリズム】
(1) n1 とする.
(2) xn/d とし(ただし,小数点以下が切り捨てられることのないようにせよ),
  y(n-1)/d とする(こちらも小数点以下も切り捨てないこと).
(3) x*x2 より小さい限り次の(3-1),(3-2),(3-3) を繰り返す:
  (3-1) nn + 1 とする.
  (3-2) yx とする.
  (3-3) xn/d とする.
(4) この時点で x (=n/d) は√2以上の最小の近似値であり,
 y(=(n-1)/d) は√2未満の最大の近似値である.そこで,xy のどちらが正解に近いかを調べる.
 もしも (x*x-2) < (2-y*y) ならば x の方が近いので n を return する.
 さもなくば y の方が近いので n-1 を return する.

  • 【プログラムの実行例】(その1)赤字は実行時にキーボードから入力する内容
2 の平方根を有理数で近似します
近似する有理数の分母を指定してください:70
近似値は 99/70 = 1.414286
  • 【プログラムの実行例】(その2)赤字は実行時にキーボードから入力する内容
2 の平方根を有理数で近似します
近似する有理数の分母を指定してください:577
近似値は 816/577 = 1.414211
  • 【プログラムの実行例】(その3)赤字は実行時にキーボードから入力する内容
2 の平方根を有理数で近似します
近似する有理数の分母を指定してください:985
近似値は 1393/985 = 1.414213

【過去にあったミス(減点となり,やり直しを命じられる)】
3種類の実行例を確認せずに提出してしまっている.
出力される分数の分子が実行例とは違っている
インデントに不備がある(VSCode 上でインデントを自動で揃える作業をやっていない).


ミスが無いことを確認したら次の問題へ → [ 練習2 (p1402a.c) ]