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ỉ.
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ỉ.
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
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)
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);
}
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);
}
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);
}
dmtmufc spam bài 2 lần (Cảnh cáo)
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!).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
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 ý!
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 )
Bookmarks