Xấp xỉ của e


21

Chúng ta đều biết rằng số Euler , được ký hiệu là e, với sức mạnh của một số biến x, có thể được xấp xỉ bằng cách sử dụng mở rộng Sê-ri Maclaurin :

Mở rộng loạt Maclaurin của e ^ x

Bằng cách để x bằng 1, chúng ta có được

Mở rộng loạt Maclaurin của e

Thử thách

Viết chương trình bằng bất kỳ ngôn ngữ nào xấp xỉ số của Euler bằng cách nhập N đầu vào và tính toán chuỗi theo thuật ngữ thứ N. Lưu ý rằng thuật ngữ đầu tiên có mẫu số 0!, Không phải 1!, Tức là N = 1 tương ứng với 1/0!.

Chấm điểm

Chương trình có số lượng byte chiến thắng ít nhất.


7
Cho đủ lớn N, kết quả sẽ giống nhau nếu sử dụng số dấu phẩy động chính xác hữu hạn. Là hành vi đó có thể chấp nhận được hay kết quả phải dần dần có được chính xác hơn khi Ntiếp cận vô hạn?
FryAmTheEggman

12
Một số trường hợp thử nghiệm sẽ được gọn gàng.
Lynn

7
(Loại vấn đề này tốt nhất là được giải quyết trong hộp cát - nếu bạn đăng các thử thách của mình lên đó trước, người chơi gôn sẽ đưa ra phản hồi hữu ích.)
Lynn

2
Là x ^ n thuật ngữ thứ n hay (n + 1) th?
msh210

4
Cá nhân tôi coi thường nó, nhưng có những người coi thuật ngữ này ở chỉ số 0 là thuật ngữ zeroth. Độc lập với suy nghĩ của chúng tôi về vấn đề đó, câu hỏi nên càng rõ ràng càng tốt. Ngoài ra, một vài trường hợp thử nghiệm để xác minh rằng các giải pháp đang hoạt động chính xác, sẽ rất hữu ích.
Dennis

Câu trả lời:


12

Thạch , 5 byte

R’!İS

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

R’!İS  Main link. Argument: n

R      Yield the range [1, ..., n].
 ’     Map decrement over the list.
  !    Map factorial over the list.
   İ   Map inverse over the list.
    S  Compute the sum.


6
Mạnh và một tháng và một lát sau, Jelly có , tạo ra một phạm vi [0, n) . ^ v ^;
Lynn

13

Wistful-C - 336 byte

Chương trình thực sự đầu tiên của tôi! Thực sự có một ít chơi golf tôi đã làm, với việc sử dụng somedaythay wait forvì bởi vì lần đầu tiên có chiều dài ngắn hơn.

if only <stdio.h> were included...
if only int f were 1...
if only int N were 0...
wish for "%d",&N upon a star
if only int i were 0...
if only double e were 0...
someday i will be N...
        if only e were e+1./f...
        if only i were i+1...
        if only f were f*i...
*sigh*
wish "%f\n",e upon a star
if wishes were horses...

Tôi đã nói rằng bạn không cần phải bao gồm<stdio.h>
Leaky Nun

someday i were N...làm việc thay vì someday i will be N...?
Nữ tu bị rò rỉ


9

TI-84 CƠ BẢN, 12 15 14

Input N
Σ(A!⁻¹,A,0,N

TI là ngôn ngữ được mã hóa ( byte được tính thông qua mã thông báo , không phải ký tự riêng lẻ).


1
Các bài đăng meta được trích dẫn có 11 upvote và 10 downvote. Đó không phải là một sự đồng thuận. Anskhông phải là định dạng đầu vào hợp lệ, vì vậy chỉ có phiên bản 15 byte là hợp lệ.
Mego

đủ công bằng; chỉnh sửa ...
Không có tên

1
Ansluôn luôn là định dạng đầu vào mặc định tại PPCG (xem qua các câu trả lời TI cũ của tôi) và nhiều người đồng ý hơn là không đồng ý với điều đó, vì vậy đừng bắt nạt thay đổi câu trả lời của bạn.
TimTech

2
@MickLH đó không phải là tranh chấp ở đây. Bên cạnh đó, đây là các byte 8 bit.
hobbs

1
@Timtech Trong khi tôi đồng ý với bạn, sự đồng thuận của cộng đồng được định nghĩa như Mego nói.
Conor O'Brien

9

Julia, 28 27 21 byte

n->sum(1./gamma(1:n))

Đây là một hàm ẩn danh chấp nhận một số nguyên và trả về một số float. Để gọi nó, gán nó cho một biến.

Cách tiếp cận khá đơn giản. Chúng tôi sumchia 1 cho hàm gamma được đánh giá ở mỗi 1 đến n . Điều này tận dụng lợi thế của tài sản n ! = Γ ( n +1).

Hãy thử trực tuyến!

Đã lưu 1 byte nhờ Dennis và 6 nhờ Glen O!


Gần như giống hệt nhau trong MATLAB:@(n)sum(1./factorial(0:n))
flawr

6

Python, 36 byte

Con trăn 2:

f=lambda n,i=1:n/i and 1.+f(n,i+1)/i

Con trăn 3:

f=lambda n,i=1:i<=n and 1+f(n,i+1)/i

Biến thể Python 3 có thể ngắn hơn orthay vì and: f=lambda n,i=1:i>=n or 1+f(n,i+1)/i.
xây dựng

6

dc, 43 byte

[d1-d1<f*]sf[dlfx1r/r1-d1<e+]se1?dk1-d1<e+p

Đây là một bản dịch khá trực tiếp của bộ truyện. Tôi đã cố gắng để thông minh hơn, nhưng điều đó dẫn đến mã dài hơn.

Giải trình

[d1-d1<f*]sf

Hàm giai thừa đơn giản, cho n> 0

[dlfx1r/r1-d1<e+]se

Thực hiện giai thừa cho n, ..., 1; đảo và tổng

1?dk1-

Prime stack với 1; chấp nhận đầu vào và đặt độ chính xác phù hợp

d1<e+

Nếu đầu vào là 0 hoặc 1, chúng ta có thể chuyển nó vào, nếu không thì tính tổng một phần.

p

In kết quả.

Kết quả kiểm tra

100 bản mở rộng đầu tiên:

0
1
2
2.500
2.6666
2.70832
2.716665
2.7180553
2.71825394
2.718278766
2.7182815251
2.71828180110
2.718281826194
2.7182818282857
2.71828182844671
2.718281828458223
2.7182818284589936
2.71828182845904216
2.718281828459045062
2.7182818284590452257
2.71828182845904523484
2.718281828459045235331
2.7182818284590452353584
2.71828182845904523536012
2.718281828459045235360273
2.7182818284590452353602862
2.71828182845904523536028736
2.718281828459045235360287457
2.7182818284590452353602874700
2.71828182845904523536028747123
2.718281828459045235360287471339
2.7182818284590452353602874713514
2.71828182845904523536028747135253
2.718281828459045235360287471352649
2.7182818284590452353602874713526606
2.71828182845904523536028747135266232
2.718281828459045235360287471352662481
2.7182818284590452353602874713526624964
2.71828182845904523536028747135266249759
2.718281828459045235360287471352662497738
2.7182818284590452353602874713526624977552
2.71828182845904523536028747135266249775705
2.718281828459045235360287471352662497757231
2.7182818284590452353602874713526624977572453
2.71828182845904523536028747135266249775724691
2.718281828459045235360287471352662497757247074
2.7182818284590452353602874713526624977572470919
2.71828182845904523536028747135266249775724709352
2.718281828459045235360287471352662497757247093683
2.7182818284590452353602874713526624977572470936984
2.71828182845904523536028747135266249775724709369978
2.718281828459045235360287471352662497757247093699940
2.7182818284590452353602874713526624977572470936999574
2.71828182845904523536028747135266249775724709369995936
2.718281828459045235360287471352662497757247093699959554
2.7182818284590452353602874713526624977572470936999595729
2.71828182845904523536028747135266249775724709369995957475
2.718281828459045235360287471352662497757247093699959574944
2.7182818284590452353602874713526624977572470936999595749646
2.71828182845904523536028747135266249775724709369995957496673
2.718281828459045235360287471352662497757247093699959574966943
2.7182818284590452353602874713526624977572470936999595749669652
2.71828182845904523536028747135266249775724709369995957496696740
2.718281828459045235360287471352662497757247093699959574966967601
2.7182818284590452353602874713526624977572470936999595749669676254
2.71828182845904523536028747135266249775724709369995957496696762747
2.718281828459045235360287471352662497757247093699959574966967627699
2.7182818284590452353602874713526624977572470936999595749669676277220
2.71828182845904523536028747135266249775724709369995957496696762772386
2.718281828459045235360287471352662497757247093699959574966967627724050
2.7182818284590452353602874713526624977572470936999595749669676277240739
2.71828182845904523536028747135266249775724709369995957496696762772407632
2.718281828459045235360287471352662497757247093699959574966967627724076601
2.7182818284590452353602874713526624977572470936999595749669676277240766277
2.71828182845904523536028747135266249775724709369995957496696762772407663006
2.718281828459045235360287471352662497757247093699959574966967627724076630325
2.7182818284590452353602874713526624977572470936999595749669676277240766303508
2.71828182845904523536028747135266249775724709369995957496696762772407663035328
2.718281828459045235360287471352662497757247093699959574966967627724076630353518
2.7182818284590452353602874713526624977572470936999595749669676277240766303535449
2.71828182845904523536028747135266249775724709369995957496696762772407663035354729
2.718281828459045235360287471352662497757247093699959574966967627724076630353547565
2.7182818284590452353602874713526624977572470936999595749669676277240766303535475915
2.71828182845904523536028747135266249775724709369995957496696762772407663035354759429
2.718281828459045235360287471352662497757247093699959574966967627724076630353547594542
2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945681
2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457111
2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571352
2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713792
2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457138185
2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382143
2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821752
2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457138217826
2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178492
2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785218
2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457138217852481
2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525131
2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251635
2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457138217852516607
2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166394

Sử dụng 1000 thuật ngữ:

2.7182818284590452353602874713526624977572470936999595749669676277240\
766303535475945713821785251664274274663919320030599218174135966290435\
729003342952605956307381323286279434907632338298807531952510190115738\
341879307021540891499348841675092447614606680822648001684774118537423\
454424371075390777449920695517027618386062613313845830007520449338265\
602976067371132007093287091274437470472306969772093101416928368190255\
151086574637721112523897844250569536967707854499699679468644549059879\
316368892300987931277361782154249992295763514822082698951936680331825\
288693984964651058209392398294887933203625094431173012381970684161403\
970198376793206832823764648042953118023287825098194558153017567173613\
320698112509961818815930416903515988885193458072738667385894228792284\
998920868058257492796104841984443634632449684875602336248270419786232\
090021609902353043699418491463140934317381436405462531520961836908887\
070167683964243781405927145635490613031072085103837505101157477041718\
986106873969655212671546889570350116

5

J, 10 byte

[:+/%@!@i.

Phương pháp tiếp cận thẳng.

Giải trình

[:+/%@!@i.    Input: n
        i.    Creates the range [0, 1, ..., n-1]
      !@      Maps factorial to each
    %@        Map 1/x to each
[:+/          Take the sum of the values and return it

Tốt đẹp. Cải thiện tầm thường 1 byte:1#.%@!@i.
Jonah

4

CJam, 11

r~,:m!Wf#:+

hoặc là

r~{m!W#}%:+

Dùng thử trực tuyến: phiên bản đầu tiênphiên bản thứ hai

Giải trình:

r~= đọc và đánh giá
m!= factorial
W#= nâng lên sức mạnh -1 ( W= -1)
:+= tổng của mảng
Phiên bản đầu tiên xây dựng mảng [0 N N-1] và áp dụng giai thừa và nghịch đảo cho tất cả các phần tử của nó; Phiên bản thứ 2 không giai thừa và nghịch đảo cho mỗi số sau đó đặt chúng vào một mảng.


4

JavaScript ES6, 44 42 40

n=>{for(k=s=m=1;m<n;s+=k/=m++);return s}

Một chức năng chưa được đặt tên bây giờ.

Cảm ơn vì đã lưu 2 byte @AlexA và cảm ơn @LeakyNun vì đã có thêm 2 byte!


n=>{for(k=s=m=1;m<n;s+=k/=m++);return s}
Nữ tu bị rò rỉ

4

MATL, 11 7 byte

:Ygl_^s

4 byte được lưu nhờ đề xuất của @ Luis để sử dụng gamma( Yg)

Dùng thử trực tuyến

Giải trình

        % Implicitly grab input (N)
:       % Create an array from 1...N
Yg      % Compute factorial(x-1) for each element (x) in the array
l_^     % Take the inverse
s       % Sum all elements
        % Implicitly display the result

Bạn có thể xóa]
Luis Mendo

Ngoài ra, 1i:Yg/svới 7 byte
Luis Mendo

@LuisMendo oh yea Tôi đã hy vọng có một cách tốt hơn để có được một nhân tố nhưng tôi đã quên về gamma. Sẽ cập nhật sớm
Suever

4

MATL , 6 byte

q_t1Zh

Điều này sẽ tính tổng bằng cách sử dụng hàm siêu bội 1 F 1 ( a ; b ; z ):

nhập mô tả hình ảnh ở đây

Hoạt động trên Octave và trên trình biên dịch trực tuyến, nhưng không phải trên Matlab, do sự khác biệt trong cách xác định hàm siêu bội (sẽ được sửa).

Hãy thử trực tuyến!

Giải trình

q_    % Take N implicitly. Compute -N+1
t     % Duplicate
1     % Push 1
Zh    % Hypergeometric function 1F1(-N+1;-N+1;1). Implicitly display

4

C, 249 byte

#include <stdio.h>
#include <stdlib.h>
#define z double
z f(z x){z r=1;z n=1;while(x>0){r*=n;n++;x--;}return r;}int main(int argc, char **argv){z e=0;z p=0;z d=0;p=strtod(argv[1],NULL);while(p>0){e+=1.0d/f(d);printf("%.10f\n",e);p--;d++;}return 0;}

Ung dung:

/* approximate e */

#include <stdio.h>
#include <stdlib.h>

double fact(double x){
    double result = 1;
    double num = 1;

    while (x > 0){
        result *= num;
        num++;
        x--;
    }
    return result;
}

int main(int argc, char **argv){
    double e = 0;
    double precision = 0;
    double denom = 0;

    precision = strtod(argv[1], NULL);
    while (precision > 0){
        e += 1.0d / fact(denom);
        printf("%.10f\n", e);
        precision--;
        denom++;
    }
    return 0;
}

Lấy một số làm đối số để xác định số lần lặp.


Xin chào, và chào mừng đến với PPCG! Bài đăng đầu tiên tuyệt vời!
NoOneIsHãy là

Chào mừng bạn đến với Câu đố lập trình & Code Golf! Tôi nghĩ rằng chương trình có nghĩa là chỉ in gần đúng cuối cùng. Ít nhất là với GCC, bạn không cần inttrước mainreturn 0. Ngoài ra, nếu bạn thay thế NULLbằng 0, bạn không cần bao gồm. argcargvcó thể được rút ngắn thành các biến đơn. Nếu bạn thích chơi gôn ở C, bạn có thể thấy Mẹo chơi golf ở C hữu ích.
Dennis

IMHO, ngay cả khi trình biên dịch đưa ra một số cảnh báo nhưng vẫn trả về kết quả chính xác, bạn có thể vứt bỏ nhiều phần mã của mình đến mức không thể giảm được gì nếu không có lỗi.
Andreï Kostyrka

Và bạn không cần#include <stdio.h>
Leaky Nun


3

05AB1E, 6 byte

$L<!/O

Giải thích

$           # push 1 and input: N = 5
 L<         # range [0..N-1]: [0,1,2,3,4]
   !        # factorial over range [1,1,2,6,24]
    /       # divide 1/range: [1.0, 1.0, 0.5, 0.16666666666666666, 0.041666666666666664]
     O      # sum: 2.708333333333333

Dùng thử trực tuyến


1
5 byte với L<!zO.
Grimmy

3

Pyke, 10 byte

FSBQi^R/)s

Hãy thử nó ở đây!

Hoặc 8 byte nếu power = 1

FSB1R/)s

Hãy thử nó ở đây!


mã đầu tiên đã bị tắt hơn 3 khi tôi chạy nó: 5.436532738095238
tox123

@ tox123 đã được sửa ngay bây giờ
Blue

bạn đang thử nghiệm những thứ này? Tôi đã nhận: 7.3887125220458545 cho lần đầu tiên, lần thứ hai hoạt động tốt hơn nhiều.
tox123

Đó là một e ^ x một mà bạn biết không chỉ e
Blue

Đó không phải là thử thách.
tox123

3

JavaScript (ES6), 28 byte

f=(n,i=1)=>n&&1+f(n-1,i+1)/i

3

APL Dyalog , 6 byte

+/÷!⍳⎕

+/tổng
÷các đối ứng của
!các giai thừa của
các số từ 0 đến
đầu vào số

Giả định ⎕IO←0 , được mặc định trên nhiều hệ thống.

Hãy thử !


3

Haskell, 37 byte

((scanl(+)0$(1/)<$>scanl(*)1[1..])!!)

Không phải là ngắn nhất, nhưng được cho là đẹp nhất.


Cũng theo phép lịch sự của Laikoni , đây là một giải pháp ngắn hơn 2 byte :

sum.(`take`((1/)<$>scanl(*)1[1..]))

λ> let f = ((scanl (+) 0 $ (1/) <$> scanl (*) 1 [1..]) !!)

λ> map f [1..5]
[1.0,2.0,2.5,2.6666666666666665,2.708333333333333]

λ> f 10
2.7182815255731922

λ> f 100
2.7182818284590455

λ> log (f 10)
0.9999998885745155

λ> log (f 100)
1.0

2
Bạn có thể sử dụng bộ đếm byte UTF-8 này . Tôi đưa vào một chỉnh sửa được đề xuất để thêm số byte của bạn, đó là 50. Để thêm một tiêu đề, sử dụng : ## Language, <xxx> bytes.
NoOneIsHãy là

1
Bạn có cần khoảng trắng?
NoOneIsHãy là

1
Bạn không thể giả sử đầu vào có mặt trong một biến, vì vậy bạn cần phải thêm trước f n=hoặc \n->để có được một chức năng đệ trình hợp lệ. Tuy nhiên, chúng ta cũng có thể lưu một vài byte: (\x->1/x)có thể rút ngắn thành phần (1/), [1,2..]giống như [1..]map(...)$có thể (...)<$>. Cùng nhau 36 byte: Hãy thử trực tuyến!
Laikoni

1
Chuyển đổi sang chức năng không có điểm giúp tiết kiệm một byte khác: Hãy thử trực tuyến! Và mặc dù nó dài hơn một byte, ((scanl(+)0$(1/)<$>scanl(*)1[1..])!!)trông cũng rất đẹp.
Laikoni

1
Như bạn đã thấy phiên bản không có dấu ngoặc đơn chỉ là biểu thức Haskell hợp lệ khi chèn giá trị vào sau nó, nhưng giả sử đầu vào có mặt trong một biến được xác định trước là không được phép , bạn phải thêm dấu ngoặc đơn hoặc một lần nữa dẫn \n->đến tạo một chức năng.
Laikoni

3

APL (Dyalog Unicode) , 5 byte

⍳⊥⊢÷!

Hãy thử trực tuyến!

Sử dụng thủ thuật cơ sở hỗn hợp được tìm thấy trong câu trả lời của tôi về một thách thức khác . Công dụng ⎕IO←0.

Làm thế nào nó hoạt động

⍳⊥⊢÷!  Right argument: n, the number of terms
  ⊢÷!  v: 1÷(n-1)!
      B: The array of 0 .. n-1
      Expand v to length-n array V,
       then mixed base conversion of V in base B

Base | Digit | Value
--------------------
0    | v     | v×(1×2×..×(n-1)) = 1÷0!
1    | v     | v×(2×3×..×(n-1)) = 1÷1!
2    | v     | v×(3×..×(n-1))   = 1÷2!
..   | ..    | ..
n-2  | v     | v×(n-1)          = 1÷(n-2)!
n-1  | v     | v                = 1÷(n-1)!

Đại diện 10k! Bây giờ để xem liệu tôi có thể thực hiện việc này trong Turing Machine không ....
ngerak

Câu trả lời hay nhưng tôi gặp khó khăn khi xem 1÷(n-1)!một chữ số như thế nào? Bạn có thể dịch nó sang J để làm rõ?
Giô-na

2

Trên thực tế, 6 byte

r♂!♂ìΣ

Hãy thử trực tuyến!

Giải trình:

r♂!♂ìΣ
r       range(N) ([0, N-1])
 ♂!     factorial of each element
   ♂ì   reciprocal of each element
     Σ  sum

2

Brachylog , 18 byte

:1-:0r:ef:$!a:/a+.

Giải trình

:1-                 Subtract 1 from Input
   :0r              Create the list [0, Input - 1]
      :ef           Find all integers between 0 and Input - 1
         :$!a       Apply factorial to each member of that list
             :/a    Apply inverse to each element of that list
                +.  Unify the output with the sum of the list

2

Phong, 18

add(1/i!,i=0..n-1)

Sử dụng:

> f:=n->add(1/i!,i=0..n-1);
> f(1);
  1
> f(4);
  8/3

Tôi nghĩ rằng chức năng là n-> add (1 / i !, I = 0..n-1)
RosLuP


2

Java với cực mười chân laser , 238 236 byte

import sj224.tflp.math.*;interface U{static void main(String[]a){BigRational r=null,s,t;r=s=t=r.ONE;for(int n=new java.util.Scanner(System.in).nextInt()-1;n-->0;){t=t.multiply(r);s=s.add(t.pow(-1));r=r.add(r.ONE);}System.out.print(s);}}

Có khả năng chống tràn tốt hơn nhiều so với hầu hết các câu trả lời khác. Đối với 100 điều khoản, kết quả là

31710869445015912176908843526535027555643447320787267779096898248431156738548305814867560678144006224158425966541000436701189187481211772088720561290395499/11665776930493019085212404857033337561339496033047702683574120486902199999153739451117682997019564785781712240103402969781398151364608000000000000000000000

2

Julia, 28 byte

~k=k<1?1:1/gamma(k+1)+~(k-1)

Giải trình

~k=                    #Define ~ to be
    k<1                #If k is less than 1
        ?1             #to be one
        :1/gamma(k+1)  #else add the reciprocal factorial to 
            +~(k-1)    #the function applied to the predecessor value

gamma(k+1)bằng với factorial(k)các đầu vào số nguyên dương và tổng quát hóa nó cho tất cả các giá trị khác với các số nguyên không âm. Nó tiết kiệm một byte, vậy tại sao không sử dụng nó?


1

MATLAB / Octave, 22 byte

@(x)sum(1./gamma(1:x))

Tạo một hàm ẩn danh có tên ans có thể được gọi bằng cách sử dụng ans(N).

Giải pháp này tính toán gamma(x)cho từng phần tử trong mảng [1 ... N] bằng factorial(x-1). Sau đó chúng ta lấy nghịch đảo của từng phần tử và tính tổng tất cả các phần tử.

Demo trực tuyến


1

Perl 5, 37 byte

Không phải là một người chiến thắng, nhưng tốt đẹp và đơn giản:

$e=$p=1;$e+=1/($p*=$_)for 1..<>;say$e

Đầu ra cho đầu vào từ 0 đến 10:

1
2
2.5
2.66666666666667
2.70833333333333
2.71666666666667
2.71805555555556
2.71825396825397
2.71827876984127
2.71828152557319
2.71828180114638

1

R, 17 byte

sum(1/gamma(1:n))

Khá đơn giản, mặc dù các vấn đề chính xác về số lượng chắc chắn sẽ phát sinh tại một số thời điểm.


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.