chắc khoảng vài năm thôi
chắc khoảng vài năm thôi
Nếu ai đó mà ngồi viết chương trình tính một tỷ giai thừa thì...(^_^), ở đây tui chỉ muốn hỏi cách giải quyết vấn đề mà thui.
the cho em cong thuc sterling la the nao
Nếu muốn tính giai thừa với thời gian nhanh bạn dùng phương pháp Quy hoạch động. Chỉ biết phương pháp như thế thui, search google thử coi. Good luck!
Bạn sử dụng cấu trúc String để giải quyết các bài toán tính toán với các số lớn nhé.
Bạn có thể sử dụng danh sách liên kết để xử lý bài này, hồi tôi đi học có làm bài tính 2 mũ n với n nguyên, theo lý thuyết thì nó chỉ phụ thuộc kích thước bộ nhớ và độ lớn số mũ n, trong bài chọn n là real cho nó lớn nhưng vẫn xử lý là số nguyên.
Nay gởi các Bạn tham khảo, chúc thành công.
Program Tinh2mu;
uses crt;
type kc=-1..9;
pn=^no;
no=record
va:kc;
next:pn
end;
Var fn,ln,he:pn;
i,mul,add,di:word;
n:real;
procedure init(var head:pn);
begin
new(head);head^.va:=-1;
head^.next:=head;
end;
procedure insertnode(var p:pn;
val:kc);
var z:pn;
begin
new(z);z^.va:=val;
z^.next:=p^.next;
p^.next:=z;p:=z;
end;
procedure writeval(he:pn);
var p,q:pn;
begin
p:=he;q:=he;
while p^.next<>he do
p:=p^.next;
write(p^.va);he:=p;
while he^.va<>-1 do
begin
while p^.next<>he do
p:=p^.next;
he:=p;
if he^.va=-1 then exit;
write(he^.va);
end
end;
BEGIN
init(he);ln:=he;fn:=he;
insertnode(ln,2);
write(' So mu (lon hon hoac = 0) = ');readln(n);
if n=0 then begin write('2^0 = 1');halt; end;
if n<0 then begin write('so mu <0 khong tinh');halt; end;
for i:=1 to trunc(n-1) do
begin
di:=0;add:=0;
while ln<>he do
begin
mul:=ln^.va*2+di;
di:=mul div 10;
ln^.va:=mul mod 10;
fn:=ln;ln:=ln^.next;
end;
if di<>0 then
insertnode(fn,di);
ln:=he^.next;fn:=he;
end;
writeval(he);
readln
END.
Mình chỉ có kinh nghiệm vấn đề này là khi xử lý số lớn các bạn đừng tính từng chữ số một mà tạo kiểu cấu trúc dữ liệu mà 1 chữ số kiểu mới gồm 9 chữ số bình thường. Vì vậy khi tính toán ta sẽ nhanh gấp tầm 9 lần
Các bạn cũng nên lưu ý nên chặt nhị phân để tính, ví dụ tính a^21
ta chỉ cần tính a^1 a^2 a^4 a^8 a^16
a^21 = a^16 * a^4 * a^1
Số lượng phép tính sẽ giảm rất nhiều
Bookmarks