Bài của e cực ngắn thôi, các anh chị giúp em cái:
Tính căn bậc 2 của số có n chữ số (n<= 10^3)
Bài của e cực ngắn thôi, các anh chị giúp em cái:
Tính căn bậc 2 của số có n chữ số (n<= 10^3)
Hả? Yêu cầu cụ thể thế nào?
Nếu không có yêu cầu cụ thể, thì quất cái hàm SQRT là xong mà.
sqrt(x)=căn bậc 2 của x
n có 10^3 chữ số cơ mà, sprt= niềm tin ah?
Chết cha, đọc ẩu, tưởng là tính căn bậc 2 của n. Có nhiều phương pháp tính căn bậc 2 của một số:
PP 1:
Có thuật toán gọi là thuật toán Newton-Raphson dùng công thức truy hồi Để tính √a ta lấy x1 tùy ý (thường là lấy x1 gần giá trị căn để tính nhanh), có x_(n+1) = (x_n + a / x_n) / 2
n càng lớn thì độ chính xác càng lớn. Nếu ta muốn có độ chính xác là e thì ta tính cho tới khi |x_n - x_(n - 1)| < e
PP 2:
Phân tích thành thừa số nguyên tố, rút gob5 ( giống như bài lý thuyết tính căn)
Cả hai phương pháp đều phải xây dựng hệ thống hàm tính toán (+,-,x, với số lớn trước.
Code bài này chắc cả ngày luôn quá, Mình có ý tường là mỗi người viết 1 khúc
- Hàm tính toán
Cong_so_lon(S1,S2: String):String;
Tru_so_lon(S1,S2: String):String;
Nhan_so_lon(S1,S2: String):String;
Chia_so_lon(S1,S2: String):String;
- Hàm tính căn bậc hai số lớn ( Theo phương pháp Newton)
Oài, chưa ai viết gì à.
Hàm thứ nhất tính tổng hai số lớn (<255 chữ số)
Các bạn test dùm .Code:Function Cong_Hai_So_Lon(S1,s2:String):String; Var i,n: Integer; s3:String; x1,x2,x3,nho:integer; Begin Nho:=false; If length(s1)>length(s2) then n:=length(s1) Else n:=length(s2); {Kiểm tra số dài hơn} For i:=n downto 1 do Begin Nho:=0; x1:=ord(s1[i])-48; {Đổi ký tự sang số} x2:=ord(s2[i])-48; x3:=x1+x2; {Cộng lại} s3[i]:=chr(x3 mod 10 +48+nho); (Đổi sang ký tự đưa vào mảng) If x3>10 then nho:=1; {xét nhớ} End; {Tính tổng xong} If nho=1 then {số cuối cùng có nhớ thì thêm 1 vào đầu mảng} Begin For i:= n+1 downto 2 do s3[i]:=s3[i-1]; s[1]:=chr(nho+48); End; Cong_Hai_So_Lon:=s3; {kết quả} End;
Note: Nếu >255 thì chuyển hết String thành mảng và thêm đếm phần tử mảng. để làm số chữ số. ( lỡ làm String rồi, làm biếng gõ lại.)
Được sửa bởi Em Chán Gà lúc 04:07 ngày 21-11-2011
Bạn(anh) nói rõ ý tưởng được ko?? Chứ số lớn thì đối với mình(em) thì ok luôn, chỉ cần ý tưởng là code xong thôi
Ý tưởng là thế này:
VD: tính A=(căn 17)
Bạn phân tích 17=16+1.
A=căn(16+1)=4*căn(1+1/16)
Bạn tính xấp xỉ của căn(1+1/16)~1+1/(2*16)
Vậy căn(16+1)=4*căn(1+1/16)~4*(1+1/(2*16))=4*(1+1/32)=33/8.
Chắc chắn khi học đạo hàm bạn cũng sẽ được học phương pháp giải gần đúng pt f(x) = 0. Nếu tôi nhớ không lầm thì bạn được học 2 pp: pp tiếp tuyến và pp dây cung.
Để tính √a ta đặt x = √a <=> x^2 - a = 0. Ta xét hàm f(x) = x^2 - a, ta phải tìm nghiệm của f(x) = x^2 - a = 0
f'(x) = 2x
Sử dụng pp tiếp tuyến ta có các xấp xỉ liên tiếp được tính theo công thức truy hồi
x_(n + 1) = x_n - f(x_n) / f'(x_n)
=> x_(n + 1) = x_n - [(x_n)^2 - a] / (2*x_n) = (x_n + a / x_n) / 2
Bookmarks