Go Back   VN-Zoom forum > Chia sẻ kiến thức > Lập trình > Pascal | C/C++

 


Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 02-06-2008, 10:03   #1
Rìu Sắt
 
die4rock's Avatar
 
Tham gia: Dec 2007
Bài: 177
VZD: 3.651
Điểm: 39/26 bài viết
Default Hàm tính giai thừa trong C!

Mình mới học C làm 1 bài tính giai thừa như sau:


#include<stdio.h>
#include<conio.h>
void main()
{
int n,i;
unsigned long s=1;
clrscr();
printf("\n Nhap n:");scanf("%d",&n);
for (i=1;i<=n;i++)
s*=i;
printf("n!= %d",s);
getch();
}

Chỉ đơn giản thế thôi,nhưng chương trình chỉ chạy đúng đến n=7, tới n=8 trở đi kết quả đều ra sai (8!=-25216???).Nhờ các bạn chỉ giúp mình với
die4rock vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-06-2008, 12:20   #2
Rìu Sắt Đôi
 
darling's Avatar
 
Tham gia: Dec 2007
Bài: 226
VZD: 5.168
Điểm: 74/44 bài viết
Default

code bạn đúng mà. 8! = 40320 mà, bạn nhập sao mà đáp án sai thế!!!

nếu bạn mới học C mời bạn wa diễn đàn mình vui chơi thử lập trình nha
__________________
Web site lập trình C/C++ http://it9x.co.cc
Kiếm tiền bằng sms http://ps.vietguys.biz/network/0989211841
darling vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-06-2008, 18:17   #3
Rìu Sắt
 
die4rock's Avatar
 
Tham gia: Dec 2007
Bài: 177
VZD: 3.651
Điểm: 39/26 bài viết
Default

Mình chịu.Mình chỉ tính đúng đến n=7.Còn từ 8 trở đi là sai hết.Mình vừa thử ở 1 máy khác cũng tương tự Bạn nào biết chỉ mình với !!!
die4rock vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-06-2008, 19:17   #4
Rìu Sắt Đôi
 
darling's Avatar
 
Tham gia: Dec 2007
Bài: 226
VZD: 5.168
Điểm: 74/44 bài viết
Default


Mình theo code của bạn nè, mình nhập n=8 đáp án đúng mà??? cái này thật tình khó hiểu nha. Dùng visual studio 6.0 nha
__________________
Web site lập trình C/C++ http://it9x.co.cc
Kiếm tiền bằng sms http://ps.vietguys.biz/network/0989211841
darling vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-06-2008, 19:45   #5
Rìu Sắt
 
die4rock's Avatar
 
Tham gia: Dec 2007
Bài: 177
VZD: 3.651
Điểm: 39/26 bài viết
Default

Đây mình chạy bằng Turbo C
n=7

n=8
die4rock vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-06-2008, 19:50   #6
Rìu Sắt Đôi
 
darling's Avatar
 
Tham gia: Dec 2007
Bài: 226
VZD: 5.168
Điểm: 74/44 bài viết
Default

vậy thì mình xin pótay. đây là trường hợp đầu tiên mình gặp. sr
__________________
Web site lập trình C/C++ http://it9x.co.cc
Kiếm tiền bằng sms http://ps.vietguys.biz/network/0989211841
darling vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-06-2008, 21:03   #7
Rìu Sắt
 
die4rock's Avatar
 
Tham gia: Dec 2007
Bài: 177
VZD: 3.651
Điểm: 39/26 bài viết
Default

Nhờ bác nào biết chỉ mình với.Gấp quá rồi.Đúng là code mình viết chạy ngon trên Cfree nhưng đi thi đâu có dùng cái đó chỉ có Turbo C++ thôi.
die4rock vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-06-2008, 21:35   #8
Rìu Sắt Đôi
 
thienthan's Avatar
 
Tham gia: Nov 2007
Bài: 291
VZD: 4.580
Điểm: 86/69 bài viết
Send a message via Yahoo to thienthan
Default

Thuật toán của bạn không hề sai.
Theo như bạn mô tả chắc là do tràn kiểu dữ liệu thôi. Một số phần mềm lập trình vẫn cho phép. Nó thực hiện tính toán bình thường nhưng nếu có cờ thì nó không được chuyển vào bit tiếp do không còn bit mà chuyển nữa. Kết quả là số được lưu chỉ có một phần thôi.
Phần ép kiểu nâng cao của C++ cũng dính một tí.

Rất đơn giản bạn thử thay nó thành kiểu long (unsigned) 4 byte thoải mái luôn vì số không âm. int trong TC chắc nó lấy dos chỉ có 2 byte thôi.
thienthan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-06-2008, 21:43   #9
Rìu Sắt
 
die4rock's Avatar
 
Tham gia: Dec 2007
Bài: 177
VZD: 3.651
Điểm: 39/26 bài viết
Default

Bạn đọc lại code mình viết mà xem,mình đã dùng unsigned long rồi đấy thôi.
die4rock vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-06-2008, 22:22   #10
Rìu Sắt Đôi
 
thienthan's Avatar
 
Tham gia: Nov 2007
Bài: 291
VZD: 4.580
Điểm: 86/69 bài viết
Send a message via Yahoo to thienthan
Default

Chịu rồi!
Giờ thì chỉ còn biết đổ cho lỗi của trình dịch thôi.
Đã để unsigned rồi mà vẫn có số âm. Bó đầu luôn.
Bạn thử bỏ unsigned đi vẫn có thể lưu được số khá dài xem còn lỗi đó không.

Thông cảm mình sài VC++ không test làm gì?
thienthan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-06-2008, 23:28   #11
Rìu Sắt
 
die4rock's Avatar
 
Tham gia: Dec 2007
Bài: 177
VZD: 3.651
Điểm: 39/26 bài viết
Default

Mình dùng đủ kiểu rồi,k0 ra.Cái chính là đi thi phải dùng TC++.Mà mình sắp thi rồi.Có ai biết cao thủ nào k0 chỉ mình với.Vì đây chỉ là bài toán đơn giản,quan trọng là mình phải làm nhiều bài toán phức tạp hơn phải dùng hàm tính giai thừa.
die4rock vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-06-2008, 09:01   #12
Rìu Sắt Đôi
 
thienthan's Avatar
 
Tham gia: Nov 2007
Bài: 291
VZD: 4.580
Điểm: 86/69 bài viết
Send a message via Yahoo to thienthan
Default

Không dùng được chuột làm khổ lắm.
TC++ à thử làm cách khác xem như thế nào.
Code:
#include <iostream>;
unsigned long giathua(unsigned byte n) {
unsigned long tmp=1;
for (unsigned byte i=2; i<=n; i++) tmp*=i;
return tmp;
}
thienthan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-06-2008, 18:24   #13
Rìu Sắt
 
die4rock's Avatar
 
Tham gia: Dec 2007
Bài: 177
VZD: 3.651
Điểm: 39/26 bài viết
Default

Chịu rồi hàm của bạn cũng k0 tác dụng.Nó có khác gì hàm của mình đâu??
die4rock vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-06-2008, 20:45   #14
Rìu Sắt
 
die4rock's Avatar
 
Tham gia: Dec 2007
Bài: 177
VZD: 3.651
Điểm: 39/26 bài viết
Default

Hô hô mình tìm ra rồi,vấn đề nằm ở câu lệnh này:
printf("n!= %d",s);
Hehe dùng đặc tả %d là sai vì nó chỉ ra kiểu int.Sửa lại đặc tả %lu là xong.
die4rock vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 04-06-2008, 05:57   #15
Rìu Sắt Đôi
 
darling's Avatar
 
Tham gia: Dec 2007
Bài: 226
VZD: 5.168
Điểm: 74/44 bài viết
Default

hay nhỉ/!!! nhưng sao VC thì lại ko bị lỗi ta -->
__________________
Web site lập trình C/C++ http://it9x.co.cc
Kiếm tiền bằng sms http://ps.vietguys.biz/network/0989211841
darling vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời

Ðiều Chỉnh
Xếp Bài

Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt
Trackbacks are Tắt
Pingbacks are Tắt
Refbacks are Tắt
Chuyển đến


Múi giờ GMT +7. Hiện tại là 06:02.


Powered by vBulletin® Version 3.7.3
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
vBCredits v1.4 Copyright ©2007 - 2008, PixelFX Studios
Từ điển được cung cấp bởi VDict.com - Hosting được tài trợ bởi Rao vặt 123