Xác định phân số tiếp tục của căn bậc hai


13

Phần tiếp tục của một số nlà một phần của dạng sau:


hội tụ đến n.

Chuỗi atrong một phân số tiếp tục thường được viết là: [a 0 ; a 1 , a 2 , 3 , ... a n ].
Chúng ta sẽ viết chúng ta theo cùng một kiểu, nhưng với phần lặp lại giữa dấu chấm phẩy.

Mục tiêu của bạn là trả về phần tiếp theo của căn bậc hai của n.
Đầu vào: Một số nguyên , n. nsẽ không bao giờ là một hình vuông hoàn hảo.
Đầu ra: Phần tiếp tục của sqrt(n).

Các trường hợp thử nghiệm:
2 -> [1; 2;]
3 -> [1; 1, 2;]
19 -> [4; 2, 1, 3, 1, 2, 8;]

Mã ngắn nhất sẽ thắng. Chúc may mắn!


1
Có đầu ra phải có cùng định dạng với các trường hợp thử nghiệm không?
grc

Không. Miễn là bạn có dấu chấm phẩy, không sao cả.
beary605

Hừm, nhận được câu trả lời đúng, gặp khó khăn khi biết phân số hợp lý để dừng lại. Có thực sự đơn giản như khi một <sub> 0 </ sub> gấp đôi sqrt của đầu vào ban đầu?
JoeFish

Đúng, đó là giới hạn.
beary605

@ beary605 cảm ơn. Đã đọc nhiều hơn và bây giờ tôi thấy rằng phần tiếp theo của căn bậc hai là một trường hợp đặc biệt. Thứ hấp dẫn! Vẫn làm việc trên một phiên bản điểm không nổi.
JoeFish

Câu trả lời:


3

GolfScript ( 66 60 ký tự)

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

Cảnh báo: hầu hết trong số ?đó là biến đại diện floor(sqrt(input))thay vì dựng sẵn. Nhưng cái đầu tiên là dựng sẵn.

Đưa đầu vào trên stdin và đầu ra thành thiết bị xuất chuẩn.

Psuedocode của thuật toán (bằng chứng về tính chính xác hiện đang để lại như một bài tập cho người đọc):

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)

Tuy nhiên, một lần nữa tôi thấy mình muốn một toán tử duy nhất đảm nhận a bstack và rời khỏi a/b a%bstack.


1
Tôi muốn nói rằng tôi thực sự cần học GS ... nhưng cần một từ quá mạnh ở đây;)
boothby

1
@boothby, đừng có điên. Cuộc sống của bạn sẽ không trọn vẹn nếu thiếu GS;)
Peter Taylor

3

Python, 95 97 (nhưng đúng ...)

Điều này chỉ sử dụng số học số nguyên và phân chia sàn. Điều này sẽ tạo ra kết quả chính xác cho tất cả các đầu vào số nguyên dương, mặc dù nếu muốn sử dụng lâu dài, họ sẽ phải thêm một ký tự; ví dụ m=a=0L. Và tất nhiên ... chờ một triệu năm để sqrt sàn của người nghèo của tôi chấm dứt.

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

Đầu ra:

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

chỉnh sửa: hiện đang sử dụng thuật toán của Peter Taylor. Đó do...whilelà niềm vui.


Mục đích của là *(c*c-n)gì?
Peter Taylor

@PeterTaylor, tôi đã không đọc thử thách đủ cẩn thận và làm cho mã hoạt động cho các ô vuông hoàn hảo.
gian hàng

2

Con trăn, 87 82 80

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

Nó nhận một số nguyên và cho đầu ra như:

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

x-int(x) -> x%1. Tôi rất ấn tượng :)
beary605

Đưa ra kết quả sai cho 39139 theo Wolfram Alpha
hộp bánh mì

Tôi đã cập nhật nó để hoạt động cho 39139. Tuy nhiên, nếu độ dài của chuỗi dài hơn nhiều (39139 có một chuỗi gồm 18 số), thì kết quả có thể sẽ bắt đầu mất độ chính xác.
grc

Tôi thấy thật thú vị khi nó luôn kết thúc bằng 2 * int (sqrt (a)).
beary605

Thú vị hơn nữa là 3 người chúng tôi đã phá mã cho 139 (của tôi vẫn chưa được đánh golf và chưa được đăng).
JoeFish

2

Toán học 33 31

c[n_]:=ContinuedFraction@Sqrt@n

Đầu ra ở định dạng danh sách, phù hợp hơn cho Mathicala. Ví dụ:

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
Người đàn ông, tôi hoàn toàn mong đợi câu trả lời này. Tôi sẽ không coi đó là một câu trả lời thực tế, trừ khi bạn tự tạo ra phân số tiếp tục.
beary605

@ beary605 Đủ công bằng.
DavidC

2
+1 Tốt hơn nữa (25 ký tự)ContinuedFraction@Sqrt@#&
Tiến sĩ belisarius

Chính xác thì bạn đang đếm gì ở đây? Đây có phải là một chương trình lấy đầu vào từ stdin? Bởi vì cách bạn sử dụng có vẻ như đó là một cơ thể chức năng mà không có định nghĩa chức năng.
Peter Taylor

@Peter Taylor Xin vui lòng xem sửa đổi.
DavidC

1

Con trăn ( 136 133 96)

Phương pháp tiêu chuẩn cho các phân số tiếp tục, cực kỳ chơi gôn.

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]

Bạn có thể lưu một vài ký tự bằng cách sử dụng while 1:. Bạn cũng có thể đặt hầu hết các câu lệnh trong vòng lặp while trên một dòng.
grc

Khi tôi chạy tập lệnh của bạn, tôi nhận được đầu ra là 8 ;1;74 và 75; Điều đó có vẻ không đúng. Nó bị treo vào ngày 76.
hộp bánh mì

^^ Yep. Đã sửa mã của tôi.
beary605

Phiên bản này cho kết quả sai cho 139.
Breadbox

@boothby Sau đó, tôi sẽ xóa của tôi và chúng tôi sẽ gọi đó là một trận hòa :)
JoeFish

1

C, 137

Bao gồm cả dòng mới, giả sử tôi không phải cuộn căn bậc hai của riêng mình.

#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);}

Nó phá vỡ cho sqrt (139) và chứa dấu chấm phẩy đôi khi xuất hiện trong đầu ra, nhưng tôi quá mệt mỏi để làm việc với nó tối nay :)

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

1

Perl, 99 ký tự

không vít lên trên 139, 151 vv Thử nghiệm với số lượng từ 1 đến 9 chữ số.

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

Lưu ý : $%, $=$-là tất cả các biến số nguyên.


1

APL (NARS), 111 ký tự, 222 byte

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

Hàm f dựa trên thuật toán tìm thấy trong trang http://mathworld.wolfram.com/PellEquation.html để giải phương trình Pell. Hàm f đó có đầu vào tất cả không phải là số âm (phân số kiểu quá). Có thể có điều gì đó không ổn, tôi nhớ rằng, trong cách tôi nhìn thấy nó, vấn đề đối với các số phần lớn, như

  √13999999999999999999999999999999999999999999999x
1.183215957E23 

vì vậy sẽ có một hàm sqrti (). Vì lý do này, đầu vào phân số (và đầu vào số nguyên) phải <10 ^ 15. kiểm tra:

 ⎕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

nếu đối số là một hình vuông của một số, nó sẽ trả về một danh sách gồm 1 phần tử duy nhất, sqrt của số đó

  f 4
2 

Nếu nó phụ thuộc vào tôi, trong một bài tập không có "codegolf", tôi thích chỉnh sửa trước đó sử dụng hàm sqrti () ...


1
chắc chắn bạn có thể sử dụng tên một chữ cái thay vì fqa0. cũng: (a×Q)-P->P-⍨a×Q
ngn

Q←Q÷⍨- Nars có hỗ trợ Q÷⍨←không?
ngn

@ngn: Tôi không thích sử dụng "Q ⍨ ←" trong chuỗi nhiều công thức chuyển nhượng ... vì vẫn đồng ý ... Có thể tôi nói vậy vì tôi thấy C Hành vi không xác định
RosLuP
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.