给定您的任务x
,输出2*x
。容易吧!!但是有一个陷阱:x
将作为(可能是无限的)连续分数给出,并且输出必须是连续分数。确保输入为实数代数,其次数最多为2。
输入:的连续分数x
。这分为三部分:整数部分,前缀和重复部分。整数部分由一个整数组成。前缀和重复部分是(可能为空)正整数数组,用于描述连续分数的前缀和重复部分。例如,输入(3, [1], [2, 4])
表示连续分数[3; 1, 2, 4, 2, 4, ...]
。
如果重复部分为空,则表示有理数。例如,(3, [1, 2], [])
代表[3; 1, 2] = 11/3
。您必须接受两种形式的有理数(即(3, [1, 1, 1], [])
,也[3; 1, 1, 1] = 11/3
应该是有效的输入)。
输出:以与输入相同的格式输出输入两倍的连续分数。如果输出是合理的,则可以输出连续分数的任何一种形式。只要答案等同于正确答案,就可以了。不需要“压缩”,因此无限部分可能会“展开”一点(例如,[1; 4, 2, 3, 2, 3...]
可能是书写的(1, [4], [2, 3])
或(1, [4, 2, 3], [2, 3])
)。所有答案必须准确。
测试用例:为方便起见,给出了准确的表格列。
Input Exact Form Output
(0, [] []) 0 (0, [] []) or (-1, [1], [])
(-5, [1, 1], []) -4.5 (-9, [], []) or (-10, [1], [])
(3, [1, 2], []) 11/3 (7, [3], []) or (7, [2, 1], [])
(1, [], [2]) sqrt(2) (2, [], [1, 4])
(-1, [2], [2, 1]) -1/sqrt(3) (-2, [1, 5], [2, 6])
最后一个稍大的测试案例,以确保精度:(0, [1], [6, 1, 3, 1, 42, 1, 3, 1, 6, 2]) --> (1, [], [1, 2, 1, 8, 1, 20, 1, 8, 1, 2, 1, 2])
。
最短的代码胜出!
提示:您可以按照此处描述的那样对连续分数以一种非常直接的方式执行算术运算。将连续分数加倍只是该算法的一种特殊情况(尽管棘手的部分可能是要找到连续分数何时重复)。
Sqrt[2]
。
[3; 1, 1, 1]
会采用(3, [1, 1, 1], [])
我们正在使用的输入格式-因此问题可能应该以该格式(在第三段中)提及,以确保清晰度。
(-2, [1, 5, 2], [6, 2])
,输入可接受的输出(-1, [2], [2, 1])
?怎么(-2, [1, 5, 2, 6, 2, 6], [2, 6])
样