Lỗi ở chỗ bạn dùng 'extended' để lưu kết quả. Biến loại extended mặc dù có range thỏa mãn yêu cầu, nhưng mà nó chỉ có 19-20 chữ số có nghĩa thôi (tức có nghĩa rằng những chữ số sau đó sẽ đc làm tròn hoặc do sai số trong máy). Bởi vậy kết quả không còn chính xác nữa. Bạn có thể thử tính 22! sẽ thấy máy bắt đầu làm tròn.
Mã:
22! = 1124000727777607[COLOR=#ff0000]680000[/COLOR] (correct answer)
22! = 1124000727777607[COLOR=#ff0000]700000[/COLOR] (your 'gt')
23! = 2585201673888497[COLOR=#ff0000]6640000[/COLOR] (correct answer)
23! = 2585201673888497[COLOR=#ff0000]7000000[/COLOR] (your 'gt')
24! = 6204484017332394[COLOR=#ff0000]39360000[/COLOR] (correct answer)
24! = 6204484017332394[COLOR=#ff0000]40000000[/COLOR] (your 'gt')
25! = 1551121004333098[COLOR=#ff0000]5984000000[/COLOR] (correct answer)
25! = 1551121004333098[COLOR=#ff0000]6000000000[/COLOR] (your 'gt')
Nhìn vào kết quả trên, bạn thấy rất rõ ràng, extended ko bao giờ ghi nhận đúng những chữ số sau 19-20 cả. Khi làm việc với kiểu số thập phân, bạn phải hết sức cẩn thận; cho dù bất kỳ ngôn ngữ nào (C, Java, Pascal, MATLAB,...) những loại biến này đều có sai số và chữ số có nghĩa cả.
Bạn nên biểu diễn bằng kiểu array lúc trc mình viết.