分数を10進数に変換し、その数値を格納する場合、特定の量のメモリのみを使用するため、多くの場合、丸める必要があります。5桁の10進数しか保存できないとすると、5/3は1.6667になります。2桁の10進数しか保存できない場合は、1.7になります(常に0〜9.99の間にあると仮定します...)。
1.7でそのプロセスを逆にしようとして、端数を取り戻したい場合、1.7は丸められた数値にすぎないことがわかっているため、それは難しい場合があります。もちろん、17/10を試すこともできますが、それは「エレガントな」5/3と比べてかなり「ugい」部分です。
そのため、目標は、分母bが最小の分数a / bを見つけることです。これにより、正しく丸められたときに丸められた10進数が得られます。
詳細
入力には、0(含む)から10(含まない)の「。」の1から5桁までの数字の文字列が含まれます。最初の数字の後。n
桁数を表すとしましょう。出力は[numerator, denominator]
、分子が非負で分母が正である2つの整数のリスト/配列または合理的なデータ型(独自に作成するか、組み込みを使用できます)である必要があります。分数の分子/分母は、n
数字(n-1
小数点以下の数字を意味する)に正しく丸められる場合、入力と等しくなければなりません。
制限:許可されるループステートメントは1つだけです。つまり、コード全体で単一のループステートメント(for
or while
またはgoto
etcなど、およびリスト/配列のすべての要素にコードを適用する、map
またはfold
そのような機能ループ)のみを使用できますが、それを「乱用」することは自由ですまたは再帰などを使用します
関数を作成する必要があります。言語に関数がない場合(またはある場合でも)、入力が変数(またはstdin経由の入力)に格納されていると仮定して、結果を出力するか、ファイルに書き込むことができます。最も少ないバイト数が優先されます。
丸め
丸めは「従来の」丸め規則に従う必要があります。つまり、切り捨てられる最後の数字が5以上の場合、切り上げ、他の場合は切り捨てます。たとえば、
四捨五入すると4.5494になります
- 1桁:5
- 2桁:4.5
- 3桁:4.55
- 4桁:4.549
例
次のテストケースとその他の「興味深い」テストケースを含めてください。
Input 1.7 Output 5/3
Input 0. Output 0/1
Input 0.001 Output 1/667
Input 3.1416 Output 355/113
for n in numbers: f(g(n))
と同等map(f, map(g, numbers))
です。機能バージョンはmap
2回使用しますが、それは本当に許可されませんか?
repeat
は、引数の無限リストを作成します。ループしているように見えますが、実際にはO(1)の時間の複雑さがあります。しかし、関数型言語を許可しないよりも、各ケースを個別にソートする方が良いと思います。