練習 1(提出プログラム名:p1401a.c)
まず,このプログラム(p1401a.c)をダウンロードしなさい.
p1401a.c では「2 の平方根(√2)」を整数の比 n/d で近似しようとしている.
具体的には,分母に相当する d が与えられた時,
n/d が最も√2 に近くなる n を以下のアルゴリズムで見つけ出そうとしている.
なお,プログラムではこのアルゴリズムを get_numerator という名前の関数で
実装しようとしているが未完成となっている.
この関数を完成させなさい.ただし,main 関数の内容は一切変更しないこと.
この問題では n, d とも正の整数であると仮定してプログラムを作ってよい.
なお,sqrt といった数学計算用の標準ライブラリ関数を使ってはいけません.
【実装すべきアルゴリズム】
(1) n ← 1 とする.
(2) x ← n/d とし(ただし,小数点以下が切り捨てられることのないようにせよ),
y ← (n-1)/d とする(こちらも小数点以下も切り捨てないこと).
(3) x*x が 2 より小さい限り次の(3-1),(3-2),(3-3) を繰り返す:
(3-1) n ← n + 1 とする.
(3-2) y ← x とする.
(3-3) x ← n/d とする.
(4) この時点で x (=n/d) は√2以上の最小の近似値であり,
y(=(n-1)/d) は√2未満の最大の近似値である.そこで,x と y のどちらが正解に近いかを調べる.
もしも (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) ]