Trang 1 / 2 12 LastLast
Hiển thị kết quả từ 1 đến 10 / 19
  1. #1
    Tham gia
    05-12-2006
    Bài viết
    13
    Like
    0
    Thanked 0 Times in 0 Posts

    trong C sao tính được giai thừa (x!)

    em mới học C được ít lâu, có bài toán vòng lặp yêu cầu tính 1 biểu thức trong đó có giai thừa, nhưng đánh dấu vào thì lại ko chạy (VD:3!),không biết trong C làm sao để tính được giai thừa nhỉ.
    Quote Quote

  2. #2
    Tham gia
    26-04-2005
    Bài viết
    393
    Like
    0
    Thanked 2 Times in 2 Posts
    Mình không biết trong thư viện của C có hàm tính giai thừa không (toán tử ! như bạn viết là toán tử NOT chứ không phải giai thừa đâu).
    Để tính được giai thừa của một số nguyên thì bạn có thể viết 1 hàm tính giai thừa (đệ quy hoặc vòng lặp), đây cũng là một bài toán cơ sở khi học C/C++ mà.
    Bạn cần chú ý là khi dùng biến lưu kết quả là kiểu số nguyên thì chỉ có thể tính giai thừa cho 1 số nguyên tương đối nhỏ. Nếu số lớn một chút là gặp lỗi tràn số ngay (dù khi kết quả lưu vào biến kiểu unsigned long). Khi cần tính cho số khá lớn thì phải dùng biến lưu kết quả kiểu float, tốt nhất là double để lưu kết quả. Khi xuất kết quả dùng định dạng "%.0lf" (không hiển thị phần thập phân).
    Được sửa bởi tienthanh_tn lúc 04:21 ngày 25-04-2007

  3. #3
    Tham gia
    05-12-2006
    Bài viết
    13
    Like
    0
    Thanked 0 Times in 0 Posts
    viết chương trình riêng để tính giai thừa thì ok, nhưng cái chính là trong một bài toán khác, lại phải lồng chương trình tính giai thừa đó vào thì mình ko rõ.
    VD như bài sau trong sách kĩ thuật lập trình của Phạm Văn ất:

    tính e^x theo công thức: e^x=1+ x^1/1! + x^2/2!+....., dừng lặp khi x^n/n! < k (k nhập từ bàn phím)

  4. #4
    Tham gia
    19-02-2007
    Bài viết
    136
    Like
    0
    Thanked 1 Time in 1 Post
    thế thì dùng đoạn mã này:
    n=1;y=y+x/n;
    while ((x/n)>=k) do
    {
    n=n*(n+1); x=x*x; y=y+(x/n);
    }

  5. #5
    Tham gia
    19-02-2007
    Bài viết
    136
    Like
    0
    Thanked 1 Time in 1 Post
    thế thì dùng đoạn mã này:
    n=1;y=y+x/n;
    while ((x/n)>=k) do
    {
    n=n*(n+1); x=x*x; y=y+(x/n);
    }

  6. #6
    Tham gia
    19-02-2007
    Bài viết
    136
    Like
    0
    Thanked 1 Time in 1 Post
    thế thì dùng đoạn mã này:
    n=1;y=y+x/n;
    while ((x/n)>=k)
    {
    n=n*(n+1); x=x*x; y=y+(x/n);
    }

  7. #7
    Tham gia
    01-05-2006
    Location
    Viettel Telecom
    Bài viết
    623
    Like
    0
    Thanked 1 Time in 1 Post
    dmtmufc spam bài 2 lần (Cảnh cáo)

  8. #8
    Tham gia
    20-02-2007
    Bài viết
    360
    Like
    0
    Thanked 3 Times in 3 Posts
    Quote Được gửi bởi tienthanh_tn View Post
    Bạn cần chú ý là khi dùng biến lưu kết quả là kiểu số nguyên thì chỉ có thể tính giai thừa cho 1 số nguyên tương đối nhỏ. Nếu số lớn một chút là gặp lỗi tràn số ngay (dù khi kết quả lưu vào biến kiểu unsigned long). Khi cần tính cho số khá lớn thì phải dùng biến lưu kết quả kiểu float, tốt nhất là double để lưu kết quả. Khi xuất kết quả dùng định dạng "%.0lf" (không hiển thị phần thập phân).
    Bạn không nên dùng kiểu double để hiển thị kết quả số nguyên, sẽ không chính xác, tốt nhất là unsigned long.

  9. #9
    Tham gia
    26-04-2005
    Bài viết
    393
    Like
    0
    Thanked 2 Times in 2 Posts
    Bạn không nên dùng kiểu double để hiển thị kết quả số nguyên, sẽ không chính xác, tốt nhất là unsigned long
    Nhưng như mình đã nói ở trên, dùng unsigned long thì không thể lưu được kết quả tính giai thừa của một số khá lớn. Bởi vì trong C, số kiểu LONG chỉ có 32 bit, số nguyên không dấu lớn nhất có thể lưu là 2^32-1 = 4294967295 (<14!).
    Khi lập trình trong windows thì có hỗ trợ số nguyên 64 bit=> có thể áp dụng tính giai thừa cho số lớn.
    Còn về sai số trong kiểu số thực thì có thể yên tâm về độ chính xác của nó, sai số (tất nhiên phải có do cách lưu dữ liệu) rất nhỏ, thực sự không ảnh hưởng nhiều đến kết quả phép toán đơn giản. Mình nghĩ vậy, nếu không đúng thì mong các bạn góp ý!

  10. #10
    Tham gia
    07-04-2004
    Bài viết
    484
    Like
    0
    Thanked 0 Times in 0 Posts
    Muốn tính giai thừa cho số lớn chỉ có cách dùng mảng kí tự(nhưng hình như không đúng chủ đề thì phải )

Trang 1 / 2 12 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
  •