Tổng ước số bằng n?
Một bạn hỏi chúng tôi bài lập trình pascal như sau: Tìm những số nguyên bé hơn hoặc bằng N (N nhập từ máy tính) có tổng ước số bằng N?
Ước số là gì ?
Ước số là những số mà nó chia hết ví dụ 6 có các ước số là 1, 2, 3 và 6
Dưới đây là một số hình ảnh quá trình code thử
Program BT; Uses Crt; Var i,n:Integer; kt:Boolean; Function TongUS(K:integer):integer; Var S,J:Integer; Begin S:=0; J:=1; While J<=Sqrt(K) do Begin If K mod J = 0 then S:=S+J; Inc(j); End; TongUS:=S+K; End; {Function} Begin {chuong trinh chinh} Clrscr; Write('Nhap so n='); Readln(n); Kt:=False; For i:=1 to n do If TongUS(i)=n then Begin Writeln('Tong uoc so cua so ',i,' =',n); Kt:=True; End; If Not Kt Then Writeln('Khong co so nao ma tong uoc so cua no =',n); Textcolor(Green); Writeln('http://www.emyeutinhoc.com'); Readln; End.
Đây là một bài tập tương đối dễ, bạn có thể thấy trong chương trình chúng tôi khai báo một biến kiểu logic là Kt, biến này mục đích đưa ra thông báo trong trường hợp người dùng nhập vào một con số và không có số nào mà tổng ước số bằng số đó.
Chỗ While J<=Sqrt(K) do e thấy chưa phù hợp lắm.
Ví dụ như số 6 thì j sẽ nhận giá trị là {1, 2} , và tổng các ước số sẽ là 1 + 2 + 6, nhưng thực tế là còn số 3 nữa. E nghĩ nên chỉnh lại điều kiện J <= (K div 2)
Cảm ơn bạn, để khi nào rảnh mình sẽ xem lại 🙂
Một lần nữa cảm ơn bạn sau khi copy code về máy test lại mình phản hồi góp ý của bạn như sau:
1. Đây không phải là bài tính tổng ước số của con số.
2. Ví dụ số 6 vòng lặp vẫn tăng tới số 3 vì 2<=2.4 là thỏa điều kiện do đó làm tiếp. While J<=Sqrt(K) ở đây mục đích là tối ưu hóa vòng lặp tương tự như bài toán kiểm tra một số có phải là số nguyên tố hay không, nếu gọi số là n thay vì phải thực hiện kiểm tra chia thử cho 2,3,4,5...n-1 thì ở đây rút ngắn lại là chỉ chia tới số <= căn bậc hai của n thôi vì lớn hơn căn bậc 2 của n kết quả sẽ không còn là số nguyên nữa. Ví dụ số 17 thì chỉ cần chia thử cho 2, 3, 4, 5 là đủ kết luận nó nt rồi. Nếu J <= (K div 2) thì bạn phải làm thêm 3 lần nữa, code như vậy là chưa tối ưu. Rất mong các góp ý khác của bạn!
E hiểu r :v
Cảm ơn a nhiều nhé <3