确定平方根的连续分数


13

整数的连续分数n是以下形式的分数:


收敛于n

a连续分数中的序列通常写为:[a 0 ; a 1,a 2,a 3,... a n ]。
我们将以相同的方式来编写我们的文章,但是在分号之间重复。

您的目标是返回的平方根的连续分数n
输入:整数nn永远不会是一个完美的广场。
输出:的连续分数sqrt(n)

测试用例:
2 -> [1; 2;]
3 -> [1; 1, 2;]
19 -> [4; 2, 1, 3, 1, 2, 8;]

最短的代码获胜。祝好运!


1
输出是否必须与测试用例具有相同的格式?
grc 2012年

不,只要您有分号,就可以了。
beary605

嗯,得到正确的答案,不知道什么时候该合理停止是有困难的。它真的像a <sub> 0 </ sub>是原始输入的sqrt的两倍一样简单吗?
JoeFish 2012年

是的,那是极限。
beary605

@ beary605谢谢。进行了更多的阅读,现在我发现平方根的连续分数有点特殊情况。令人着迷的东西!仍在非浮点版本上工作。
JoeFish 2012年

Answers:


3

GolfScript(66 60个字符)

~:^,{.*^>}?(:?';'[1?{^1$.*-@/?@+.2$/@@1$%?\- 1$(}do;;]','*1$

警告:其中的大多数?是代表floor(sqrt(input))而不是内置变量。但是第一个是内置的。

在stdin上输入并输出到stdout。

算法的伪代码(正确性证明,目前仍供读者练习):

n := input()
m := floor(sqrt(n))
output(m)
x := 1
y := m
do
  x := (n - y * y) / x
  output((m + y) / x)
  y := m - (m + y) % x
while (x > 1)

再一次,我发现自己想要一个单独的运算符来接管a b堆栈并离开a/b a%b堆栈。


1
我想说,我真的需要学习GS ......但需要在这里有点太强烈的一个字;)
布思

1
@boothby,别疯了。没有GS,您的生活将是不完整的;)
彼得·泰勒

3

Python,95 97(但正确...)

这仅使用整数算术和底数除法。这将为所有正整数输入产生正确的结果,尽管如果要使用long,则必须添加一个字符。例如m=a=0L。当然...要等一百万年,我的穷人的地板sqrt才能终止。

z=x=m=1
while n>m*m:m+=1
m=y=m-1
l=()
while-z<x:x=(n-y*y)/x;y+=m;l+=y/x,;y=m-y%x;z=-1
print c,l

输出:

n=139
11 (1, 3, 1, 3, 7, 1, 1, 2, 11, 2, 1, 1, 7, 3, 1, 3, 1, 22)

编辑:现在使用彼得·泰勒算法。这do...while很有趣。


目的是*(c*c-n)什么?
彼得·泰勒

@PeterTaylor,我没有足够仔细地阅读挑战,并使代码适用于完美的正方形。
展位,

2

蟒蛇,87 82 80

x=r=input()**.5
while x<=r:print"%d"%x+",;"[x==r],;x=1/(x%1)
print`int(r)*2`+";"

它需要一个整数,并给出如下输出:

4; 2, 1, 3, 1, 2, 8;

x-int(x) -> x%1。我印象深刻:)
beary605


我更新了它以使用√139。但是,如果序列的长度变得更长(√139具有18个数字的序列),则结果可能会开始失去准确性。
grc 2012年

我发现它总是以2 * int(sqrt(a))结尾非常有趣。
beary605

更加有趣的是,现在我们三个人都破坏了139的代码(我的代码仍未发布和发布)。
JoeFish 2012年

2

Mathematica 33 31

c[n_]:=ContinuedFraction@Sqrt@n

输出为列表格式,更适合Mathematica。例子:

c[2]
c[3]
c[19]
c[139]
c[1999]

(* out *)
{1, {2}}
{1, {1, 2}}
{4, {2, 1, 3, 1, 2, 8}}
{11, {1, 3, 1, 3, 7, 1, 1, 2, 11, 2, 1, 1, 7, 3, 1, 3, 1, 22}}
{44, {1, 2, 2, 4, 1, 1, 5, 1, 5, 8, 1, 3, 2, 1, 2, 1, 1, 1, 1, 1, 1, 
  1, 14, 3, 1, 1, 29, 4, 4, 2, 5, 1, 1, 17, 2, 1, 12, 9, 1, 5, 1, 43, 
  1, 5, 1, 9, 12, 1, 2, 17, 1, 1, 5, 2, 4, 4, 29, 1, 1, 3, 14, 1, 1, 
  1, 1, 1, 1, 1, 2, 1, 2, 3, 1, 8, 5, 1, 5, 1, 1, 4, 2, 2, 1, 88}}

1
哦,我完全希望得到这个答案。除非您自己生成连续分数,否则我不会将其视为实际答案。
beary605

@ beary605足够公平。
DavidC 2012年

2
+1更好(25个字符)ContinuedFraction@Sqrt@#&
belisarius博士2012年

您到底在这里算什么?这是从stdin接收输入的程序吗?因为您使用它的方式看起来像是没有函数定义的函数主体。
彼得·泰勒

@Peter Taylor请参阅修正案。
DavidC 2012年

1

蟒蛇(13613396

连续分数的标准方法,打高尔夫球。

a=input()**.5
D=c=int(a);b=[]
while c!=D*2:a=1/(a%1);c=int(a);b+=[c]
print D,";%s;"%str(b)[1:-1]

您可以使用来保存一些字符while 1:。您还可以将大多数语句放在while循环中的一行上。
grc 2012年

运行脚本时,输出分别8 ;1;为74和75。这似乎不正确。它挂在76上
。–面包盒

^^是的。修正了我的代码。
beary605

该版本给出的错误结果为
139。–面包盒

@boothby然后我将删除我的,我们将其称为平局:)
JoeFish 2012年

1

C,137

包括换行符在内,假设我不必滚动自己的平方根。

#include<math.h>
main(i,e){double d;scanf("%lf",&d);e=i=d=sqrt(d);while(i^e*2)printf("%d%c",i,e^i?44:59),i=d=1.0/(d-i);printf("%d;",i);}

它会因为sqrt(139)而中断,并且偶尔会在输出中包含分号,但我太累了,无法在今晚进一步处理它:)

5
2; 4;
19
4; 2,1,3,1,2,8;
111
10; 1,1,6,1,1,20;

1

Perl,99个字符

没有对139,151,等等。取值范围为1到9个位数测试弄糟。

$"=",";$%=1;$==$-=($n=<>)**.5;
push@f,$==(($s=$=*$%-$s)+$-)/($%=($n-$s*$s)/$%)until$=>$-;
say"$-;@f;"

注意:$%$=$-都是强制整数变量。


1

APL(NARS),111个字符,222个字节

r←f w;A;a;P;Q;m
m←⎕ct⋄Q←1⋄⎕ct←P←0⋄r←,a←A←⌊√w⋄→Z×⍳w=0
L: →Z×⍳0=Q←Q÷⍨w-P×P←P-⍨a×Q⋄r←r,a←⌊Q÷⍨A+P⋄→L×⍳Q>1
Z: ⎕ct←m

f函数基于在http://mathworld.wolfram.com/PellEquation.html页面上找到的 用于求解Pell方程的算法。该f函数的输入全都不为负数(也为类型分数)。可能出了点问题,我记得√在我看来,存在大分数的问题,例如

  √13999999999999999999999999999999999999999999999x
1.183215957E23 

所以会有一个函数sqrti()。因此,分数输入(和整数输入)必须<10 ^ 15。测试:

 ⎕fmt (0..8),¨⊂¨f¨0..8
┌9───────────────────────────────────────────────────────────────────────────────────────────────────────┐
│┌2─────┐ ┌2─────┐ ┌2───────┐ ┌2─────────┐ ┌2─────┐ ┌2───────┐ ┌2─────────┐ ┌2─────────────┐ ┌2─────────┐│
││  ┌1─┐│ │  ┌1─┐│ │  ┌2───┐│ │  ┌3─────┐│ │  ┌1─┐│ │  ┌2───┐│ │  ┌3─────┐│ │  ┌5─────────┐│ │  ┌3─────┐││
││0 │ 0││ │1 │ 1││ │2 │ 1 2││ │3 │ 1 1 2││ │4 │ 2││ │5 │ 2 4││ │6 │ 2 2 4││ │7 │ 2 1 1 1 4││ │8 │ 2 1 4│││
││~ └~─┘2 │~ └~─┘2 │~ └~───┘2 │~ └~─────┘2 │~ └~─┘2 │~ └~───┘2 │~ └~─────┘2 │~ └~─────────┘2 │~ └~─────┘2│
│└∊─────┘ └∊─────┘ └∊───────┘ └∊─────────┘ └∊─────┘ └∊───────┘ └∊─────────┘ └∊─────────────┘ └∊─────────┘3
└∊───────────────────────────────────────────────────────────────────────────────────────────────────────┘
  f 19
4 2 1 3 1 2 8 
  f 54321x
233 14 1 1 3 2 1 2 1 1 1 1 3 4 6 6 1 1 2 7 1 13 4 11 8 11 4 13 1 7 2 1 1 6 6 4 3 1 1 1 1 2 1 2 3 1 1 14 466 
  f 139
11 1 3 1 3 7 1 1 2 11 2 1 1 7 3 1 3 1 22 
  +∘÷/f 139
11.78982612
  √139
11.78982612

如果参数是一个数字的平方,它将返回一个仅包含1个元素的列表,该数字的sqrt

  f 4
2 

如果这取决于我,在没有“ codegolf”的练习中,我希望使用函数sqrti()的先前编辑...


1
当然,您可以使用单字母名称代替fqa0。还:(a×Q)-P->P-⍨a×Q
ngn

Q←Q÷⍨-nars支持Q÷⍨←吗?
ngn

@ngn:我不喜欢在多个赋值公式的链中使用“ Q÷⍨←” ...为了保持一致...可能是因为我看到C未定义行为
RosLuP '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.