Cho N<2000 tính tổng các chữ số của N

đầu bài cho N<2000 tính tổng các chữ số của N!
ví dụ N=2 => N!=2 kết quả là 2
N=4 => N!=24 kq là 6
N=6 => kq là 9
N=1700 => kq là 24
tớ mới tính được 1750! ai có thể tính đc hơn không chỉ mình với!!!
 

max908

Mình thấy có gì đó sai sai ở đoạn N = 1700! sao lại bằng 24.
Đây là đáp án của mình với N = 2000! tổng các số = 23382.
 

tengiday

Happy life
Đoạn code lúc trước mình viết cho bạn chạy ra 23382 với N = 2000 và 20169 với N = 1750 mà.
 
Mình thấy có gì đó sai sai ở đoạn N = 1700! sao lại bằng 24.
Đây là đáp án của mình với N = 2000! tổng các số = 23382.
tớ không rõ nữa nhưng test nhỏ mình đúng hết. với lại người ta cm rồi N! càng lớn thì càng nhiều số 0 bạn à
 

tengiday

Happy life
tớ không rõ nữa nhưng test nhỏ mình đúng hết. với lại người ta cm rồi N! càng lớn thì càng nhiều số 0 bạn à
Còn có phần không bằng 0 nữa; phần này mới là càng ngày càng nhiều chữ số khác 0. Bởi vậy kết quả là tăng dần.
Bạn xem lại có bị overflow biến không, có thể post code để xem thế nào.
 
Sửa lần cuối:
Còn có phần không bằng 0 nữa; phần này mới là càng ngày càng nhiều chữ số khác 0. Bởi vậy kết quả là tăng dần.
Bạn xem lại có bị overflow biến không, có thể post code để xem thế nào.

Mã:
Const Fi = 'GIAITHUA.INP';
        Fo = 'GIAITHUA.OUT';
  Var   F1 , F2 : Text;
        N ,i, s,x: Word;
        gt : extended;
        s1 : ansistring;
  Begin
Assign(F1,Fi);
Reset(F1);
Assign(F2,Fo);
Rewrite(F2);
     While not eof(F1) do
     Begin
          REadln(F1,N);
          gt:=1;
          for i:=1 to n do gt:=gt*i;
          str(gt:3:0,s1);
          s:=0;
          for i:=1 to length(s1) do
          Begin
               val(s1[i],x);
               s:=s+x;
          end;
          writeln(f2,s);
     end;
close(F2);
  End.
                                 {  programmed by Hieu }
code của mình hình như sai ở chỗ xâu s1:ansistring hình như không đủ cho 1700! nên nó tính khoảng kí tự của ansistring
mong các bạn giúp đỡ
 

tengiday

Happy life
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.
 
Sửa lần cuối:
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.
bạn gửi code cho mk xem thử đi nhé!!
 
Top