SBT chỉ cần n=44 thôi, kiểu longint trong pas vùa đủ, cần gì 10000
SBT chỉ cần n=44 thôi, kiểu longint trong pas vùa đủ, cần gì 10000
Mình nhớ không nhầm cái longint của pascal chỉ ăn đc đến 12!,lấy đâu ra mà 44! vậy ?
Còn nếu muốn lớn hơn một tẹo nữa mà không cần dùng số lớn thì hãy dùng kiểu số nguyên 64 bit int64 hoặc qword,nó có thể chạy chính xác đến khoảng 20!,21!.
Còn lớn hơn thì đương nhiên là phải xử lý số lớn rồi,nếu bạn dùng mảng để xử lý số lớn nên dùng hệ cơ số lớn một chút,10^12 chẳng hạn,sẽ cho tốc độ khá ok.
program TInh_GT;
uses crt;
var N,i : integer;
p: real;
begin
clrscr;
writeln(' hay nhap so N'); readln(N);
p:=1
for i:=1 to N do p:= p*i
writeln(' N giai thua se la',p);
end.
cac bac thay em lamthe nao
ai giải giúp tui bài nài với:
Tính S=1/1!+1/2!+1/3!+.....+1/n! ( cho đến khi n<=1/m với m =10^-6)
ct này nhiêu lỗi wá
ct này chạy 50! nhanh mà , còn dùg đệ wy thì 7! là hết đát . Ai kiếm đc biến nào tốt hơn để ko bị tràn biến thì may ra .Code:program TInh_GT; uses crt; var N,i : integer; p: real; begin clrscr; writeln(' hay nhap so N'); readln(N); p:=1; for i:=1 to N do p:= p*i; writeln(' N giai thua se la',p); readln; end.
em viết chương trình thế này, có dùng chương trình con, ko biết có ổn ko, mong mọi người giúp đỡ.
program giaithua;
uses crt;
var n:integer;
function gt(n:integer):integer;
var s,i:integer;
begin
s:=1;
i:=1;
while n<=30 do
s:=s*i;
i:=i+1; gt:=s;
end;
begin clrscr;
writeln(‘Chuong trinh tinh giai thua so n voi n nho hon hoac bang 30’);
repeat
begin
write('Nhap n:');
readln(n); end;
until n<=30;
writeln(gt(n));
readln;
end.
Có thể bài tính giai thừa có rất nhiều cách. Tuy nhiên do tính giai thừa sẽ trả lại số rất lớn. Có thế ở trường số integer chỉ tính được số rất nhỏ theo tôi nghĩ có thể tính chính xác với số n <= 12. Nếu tính số lớn hơn sẽ cho kết quả không chính xác.
Bạn có thể tham khảo chương trình tính giai thừa với số < 146 như sau. Bài này do tôi viết.
Program Tinh_giai_thua_so_lon_nho_hon_146;
Uses Crt;
Label L1,L2;
Var t:String[1];n:Integer;
Procedure Giaithuasl;
Label L3;
Var x,k1,k,k2,i,j1,i1,j,m,q,nho,max,dem:integer; A,B,C:Array [1..1000] of 0..9;
S,t1,S1,S2:String; D: Array [0..4,0..1000] of 0..9;
Begin
q:=1; Str(n,S1);
Repeat Str(n-q,S2);
For j1:=1 to Length(S1) do Val(S1[j1],A[j1],k2);
For j1:=1 to Length(S2) do Val(S2[j1],B[j1],k2);
x:=1;
For k1:=(Length(S1)+Length(S2)+1) downto 1 do D[x,k1]:=0;
For i:=Length(S2) downto 1 do
Begin j:=Length(S2)-i; For k1:=1 to j do C[k1]:=0;
nho:=0;j:=j+1;
Begin m:=Length(S1);
While m>0 do Begin C[j]:=(B[i]*A[m]+nho) mod 10;
nho:=(B[i]*A[m]+nho) div 10;
m:=m-1;j:=j+1;
End;C[j]:=nho;
For k1:=j+1 to (Length(S1)+Length(S2)+1) do C[k1]:=0;
End;
nho:=0;k:=1;max:=Length(S1)+Length(S2); x:=x+1;
While k<max+2 do Begin
D[x,k]:=(C[k]+D[x-1,k]+nho) mod 10;
nho:=(C[k]+D[x-1,k]+nho) div 10;
k:=k+1;
End; k:=k-1;
End;
i1:=k;
Repeat if D[x,i1] = 0 then i1:=i1-1;Until D[x,i1] <> 0;
if n-q = 2 then goto L3;
S:='';
For k:=i1 downto 1 do Begin Str(D[x,k],t1); S:=S+t1;End; S1:=S;q:=q+1;
Until n-q = 1;
L3: Write(' ',n,'! = '); Dem:=0;
For k:=i1 downto 1 do Begin Write(D[x,k]);Dem:=dem+1;if dem mod 1000 = 0 then
Begin Readln; Clrscr; End; End;Writeln;
Writeln('Ket qua co ',i1,' chu so');
End;
BEGIN L1:
Write('Nhap so can tinh giai thua, n = ');Readln(n);
Giaithuasl;
Write('Nhan Spacebar roi Enter de tinh tiep');readln(t);
If t=' ' then goto L1 else goto L2;
Readln;L2:
END.
Một bài khác tính giai thừa với số < 952 như sau.
Program Tinh_giai_thua_so_lon_nho_hon_952;
Uses Crt;
Type Mang = Array [1..3,1..2423] of 0..9;
Label L1,L2;
Var t:String[1];n:Integer;
Procedure Giaithuasl;
Label L3;
Var x,k1,k,k2,i,j1,i1,i2,j,m,q,nho,max,dem:integer;
A,B,C:Array [1..2423] of 0..9;
S,t1,S1,S2:String; D:Mang;
Begin
q:=1; Str(n,S1);For j1:=1 to Length(S1) do Val(S1[j1],A[j1],k2);i1:=Length(S1);
Repeat Str(n-q,S2);
For j1:=1 to Length(S2) do Val(S2[j1],B[j1],k2);
x:=1;
For k1:=(i1+Length(S2)+1) downto 1 do D[x,k1]:=0;
For i:=Length(S2) downto 1 do
Begin j:=Length(S2)-i; For k1:=1 to j do C[k1]:=0;
nho:=0;j:=j+1;
Begin m:=i1;
While m>0 do Begin C[j]:=(B[i]*A[m]+nho) mod 10;
nho:=(B[i]*A[m]+nho) div 10;
m:=m-1;j:=j+1;
End;C[j]:=nho;
For k1:=j+1 to (i1+Length(S2)+1) do C[k1]:=0;
End;
nho:=0;k:=1;max:=i1+Length(S2); x:=x+1;
While k<max+2 do Begin
D[x,k]:=(C[k]+D[x-1,k]+nho) mod 10;
nho:=(C[k]+D[x-1,k]+nho) div 10;
k:=k+1;
End; k:=k-1;
End;
i1:= k;
Repeat if D[x,i1] = 0 then i1:=i1-1;Until D[x,i1] <> 0;i2:=i1;
For k:=i1 downto 1 do A[i1-k+1]:= D[x,k];
if n-q = 2 then Break; q:=q+1;
Until n-q = 1;
Write(' ',n,'! = '); Dem:=0;
For j:= 1 to i2 do
Begin Write(A[j]);Dem:=dem+1;if dem mod 1000 = 0 then Begin Readln; Clrscr; End;End;
Writeln;
Writeln('Ket qua co ',i1,' chu so');
End;
BEGIN L1:
Write('Nhap so can tinh giai thua, n = ');Readln(n);
Giaithuasl;
Write('Nhan Spacebar roi Enter de tinh tiep');readln(t);
If t=' ' then goto L1 else goto L2;
Readln;L2:
END.
Với số n < 10001 chương trình như sau.
Program Tinh_giai_thua_voi_so_rat_lon_10001;
Uses Crt;
Var A:array[1..64770] of 0..9;
n,i,dem,dem1:longint;t:String[1];
Procedure Giaithua(Var m:Longint);
Var k,k1,k2,k3,i:longint;
Begin
A[1]:=1;dem:=1;k3:=1;
For i:=1 to m do
Begin k1:= 0;
For k:=k3 to dem do
Begin k2:=i*A[k];
A[k]:=(k2+k1) mod 10;
k1:=(k2+k1) div 10;
End;
While k1>0 do Begin inc(dem);
A[dem]:=k1 mod 10;
k1:=k1 div 10;
End;
While A[k3]=0 do Inc(k3);
End;
End;
BEGIN
Repeat
Repeat write('Nhap so can tinh giai thua n = ');readln(n); Until (n>=0) and (n<=10000);
Giaithua(n);
Write(n,'! = ');Dem1:=0;for i:= dem downto 1 do Begin Write(A[i]); Dem1:=Dem1+1;if dem1 mod 300 = 0 then Readln; End;
Writeln;Writeln('Ket qua co ',dem,' chu so');
Write('Nhan Spacebar roi Enter de tinh tiep');readln(t);
If t=' ' then Begin For i:=1 to dem do A[i] := 0;End
Until (t<>' ');
END.
Chúc bạn có những phút giây vui vẻ với những bài góp ý của tôi. Bạn có thể liên lạc với tôi qua địa chỉ mail quangdiem_hp@yahoo.com.vn.
Mọi thắc mắc về lập trình tôi có thể giúp bạn.
cac ban cho minh cau truc cua de quy, exam 1 bai cho minh lam nha, ghi cau truc ky ky vao nha, cam on nhieu
Bookmarks