Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: Các anh chị cho em hỏi tý

  1. #1
    Ngày gia nhập
    02 2012
    Bài viết
    0

    Mặc định Các anh chị cho em hỏi tý

    Em có một đoạn code sau để tính n giai thừa:

    // Chuong trinh tinh n giai thua n!
    #include "iostream"
    using namespace std;
    #include "conio.h"
    #include "stdio.h"
    void main ()
    {
    int i, n, f = 1;
    cout<< "Nhap n: ";
    cin>> n;
    for (i = 1; i <= n; i++)
    {
    f = f*i;
    }
    cout<< n<< " giai thua bang: "<< f;
    getch();
    }

    Khi em nhập vào các số nhỏ thì chương trình tính rất đúng nhưng khi nhập vào số lớn, số 90 chẳng hạn, thì chương trình chỉ trả về số 0.
    Mong anh chị giải đáp giúp em!

    Ảnh kèm theo:


  2. #2
    Ngày gia nhập
    09 2011
    Nơi ở
    Huế
    Bài viết
    0

    Vì 90 giai thừa vượt quá độ lớn của kiểu dữ liệu, kiểu int tầm 32k thôi. bạn thử khai báo Long f=1 coi

  3. #3
    Ngày gia nhập
    11 2010
    Nơi ở
    Black Hole
    Bài viết
    824

    int chỉ có 4 bytes. điều đó tương đương giá trị : -2147483647 to 2147483647.
    Như một đường tròn,khi giá trị nhận dc lớn hơn 2147483647 thì sẽ quay về giá trị âm và cứ thế.

    Giá trị 0 bạn nhận dc mình ko dám chắc là nó rơi ngẫu nhiên vào giá trị 0 của sự tuần hoàn này. Bạn lưu ý điều này nhé.

    Để tính giai thừa của số lớn thì cần có chúc thủ thuật. Bạn có thể tìm trên Cviet, có khoản hơn 100 bài kiểu đó.
    Đã được chỉnh sửa lần cuối bởi clamvn : 25-02-2012 lúc 08:42 PM.
    Come as guest...... stay as family......... because we're smiling together.

  4. #4
    Ngày gia nhập
    11 2010
    Bài viết
    589

    Để tính chính xác giai thừa số lớn bạn phải dùng một thư viện xử lý số lớn, vd như GMP. Sau đó có thể dùng các thuật toán tính giai thừa hiệu quả như Swing Factorial chẳng hạn.

  5. #5
    Ngày gia nhập
    02 2012
    Bài viết
    0

    Em cảm ơn các câu trả lời của các anh (chị), nhưng không biết có ai giải thích chính xác cho em tại sao chương trình lại trả về số 0 được không ạ?
    Em cảm ơn!

  6. #6
    Ngày gia nhập
    11 2010
    Bài viết
    589

    Mặc định Các anh chị cho em hỏi tý

    ^
    Do vấn đề tràn số nên chương trình sẽ trả về số dư của n! khi chia cho 2^31 (tính chất của đồng dư thức).
    Với n đủ lớn thì số mũ của 2 trong phân tích thừa số nguyên tố của n! sẽ lớn hơn 31, tức là n! chia hết cho 2^31 => trả về 0.

    Công thức toán học Latex
    VD: n = 90, số mũ của 2 trong phân tích nguyên tố của 90! là 45 + 22 + 11 + 5 + 2 + 1 = 86 > 31 => 90! chia hết cho 2^31

  7. #7
    Ngày gia nhập
    01 2012
    Nơi ở
    Hà Tĩnh
    Bài viết
    25

    Mặc định xuannam2620

    Trích dẫn Nguyên bản được gửi bởi boss14420 Xem bài viết
    ^
    Do vấn đề tràn số nên chương trình sẽ trả về số dư của n! khi chia cho 2^31 (tính chất của đồng dư thức).
    Với n đủ lớn thì số mũ của 2 trong phân tích thừa số nguyên tố của n! sẽ lớn hơn 31, tức là n! chia hết cho 2^31 => trả về 0.

    Công thức toán học Latex
    VD: n = 90, số mũ của 2 trong phân tích nguyên tố của 90! là 45 + 22 + 11 + 5 + 2 + 1 = 86 > 31 => 90! chia hết cho 2^31
    bạn có thể giải thích cho mình hiểu rõ hơn được không. mình không hiểu câu:
    "Công thức toán học Latex
    VD: n = 90, số mũ của 2 trong phân tích nguyên tố của 90! là 45 + 22 + 11 + 5 + 2 + 1 = 86 > 31 => 90! chia hết cho 2^31"
    lắm
    tks bạn nhiều nha

  8. #8
    Ngày gia nhập
    10 2011
    Bài viết
    552

    Ẹc, cái đó là công thức và lý thuyết.
    Người ta chỉ dẫn ra để thuyết phục vì sao là như vậy thôi
    Còn muốn tìm hiểu ngọn ngành thì đi search từ khóa: Đồng dư . Rồi các lý thuyết của nó : Fermat, Euler ...
    Chứ ai mà giờ mất công đi "giảng" lại lý thuyết cho bạn đâu ^^
    Um Mani Padme Hum...!!

  9. #9
    Ngày gia nhập
    11 2010
    Bài viết
    589

    Trích dẫn Nguyên bản được gửi bởi xuannam2620 Xem bài viết
    bạn có thể giải thích cho mình hiểu rõ hơn được không. mình không hiểu câu:
    "Công thức toán học Latex
    VD: n = 90, số mũ của 2 trong phân tích nguyên tố của 90! là 45 + 22 + 11 + 5 + 2 + 1 = 86 > 31 => 90! chia hết cho 2^31"
    lắm
    tks bạn nhiều nha
    Đầu tiên ta có 90 số 1, 2, 3, 4, ..., 90
    90! = 1 x 2 x 3 x 4 x 5 x 6 x ... x 90

    - Cứ 2 số lại có một số chia hết cho 2 => có 90 / 2 = 45 số chia hết cho 2 => 90! = 2^45 * x
    - Tiếp theo, cứ 4 số lại có 1 số chia hết cho 4 => có 90 / 4 = 22 số chia hết cho 4, => 90! = 2^45 * 2^22 * y
    ...

Quyền hạn của bạn

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