Trang 2 / 3 FirstFirst 123 LastLast
Hiển thị kết quả từ 11 đến 20 / 24
  1. #11
    Tham gia
    28-09-2007
    Location
    Vĩnh Yên-Vĩnh Phúc
    Bài viết
    1,167
    Like
    6
    Thanked 14 Times in 12 Posts
    SBT chỉ cần n=44 thôi, kiểu longint trong pas vùa đủ, cần gì 10000

  2. #12
    Tham gia
    01-05-2006
    Location
    Viettel Telecom
    Bài viết
    623
    Like
    0
    Thanked 1 Time in 1 Post
    Quote Được gửi bởi ninjapro View Post
    @chopes: Tính giai thừa thôi, cần gì phải "đao to búa lớn" thế. Nhưng nếu bạn đang nghiên cứu đệ quy thì code trên là một vd đấy.


    Dùng mảng chi vậy bạn? 2 biến là đủ rồi. Vấn đề đáng quan tâm là khả năng tính toán số lớn thôi. Nhưng nếu bạn có thể làm được như bạn nói thì gửi code lên cho mình học hỏi với.
    Về cơ chế thì nó chẳng khác gì nhau cả, ai bảo bạn 50! là die ???

    Trong trường hợp này thì dùng đệ quy với dùng mảng ko thể hiện được sự khác biệt mà là VD như trong trường hợp Fibonacci ấy :|

  3. #13
    Tham gia
    18-02-2008
    Location
    PTC Sư Phạm
    Bài viết
    81
    Like
    0
    Thanked 2 Times in 1 Post
    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.

  4. #14
    Tham gia
    30-11-2008
    Bài viết
    3
    Like
    0
    Thanked 0 Times in 0 Posts
    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

  5. #15
    Tham gia
    28-11-2008
    Bài viết
    3
    Like
    0
    Thanked 0 Times in 0 Posts
    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)

  6. #16
    Tham gia
    03-11-2007
    Bài viết
    21
    Like
    0
    Thanked 2 Times in 2 Posts
    Quote Được gửi bởi hoangtu123 View Post
    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
    cái này thì cũng đúng đấy.nhưng tính giai thừa thì người ta yêu cầu làm băng đệ quy cơ ban ơi.

  7. #17
    Tham gia
    13-12-2008
    Location
    Vũng Tàu
    Bài viết
    393
    Like
    0
    Thanked 2 Times in 2 Posts
    Quote Được gửi bởi hoangtu123 View Post
    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
    ct này nhiêu lỗi wá
    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.
    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 .

  8. #18
    Tham gia
    29-04-2009
    Bài viết
    4
    Like
    0
    Thanked 0 Times in 0 Posts
    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.

  9. #19
    Tham gia
    06-02-2009
    Bài viết
    14
    Like
    0
    Thanked 0 Times in 0 Posts

    Tính giai thừa số lớn

    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.

  10. #20
    Tham gia
    06-04-2009
    Bài viết
    6
    Like
    0
    Thanked 0 Times in 0 Posts
    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

Trang 2 / 3 FirstFirst 123 LastLast

Bookmarks

Quy định

  • Bạn không thể tạo chủ đề mới
  • Bạn không thể trả lời bài viết
  • Bạn không thể gửi file đính kèm
  • Bạn không thể sửa bài viết của mình
  •