当您将分数转换为十进制数并想要存储该数时,通常必须舍入该数,因为您只想使用一定数量的内存。假设您只能存储5个十进制数字,则5/3变为1.6667。如果只能存储2个十进制数字,则它将是1.7(现在假设它始终在0到9.99之间...)。
如果您现在尝试使用1.7逆转该过程,并且想要取回小数,那将是困难的,因为您知道1.7只是一个四舍五入的数字。当然,您可以尝试17/10,但与“优雅” 5/3相比,这是一个“丑陋”的分数。
因此,现在的目标是找到分母为b的分数a / b,在正确舍入后得出舍入的十进制数。
细节
输入包含1到5位数字的字符串,介于0(包括)和10(不包括)之间,并带有'。'。在第一个数字之后。假设n
表示位数。输出必须是两个整数的列表/数组,[numerator, denominator]
或者是一个分子为非负数且分母为正数的有理数据类型(可以创建自己的数据类型或使用内置数据类型)。正确四舍五入为n
数字(即n-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
两次,真的应该禁止吗?
repeat
创建了其参数的无限列表。我似乎循环了,但实际上它的时间复杂度为O(1)。但是我想单独对每种情况进行排序总比不允许使用功能语言更好。