11/05/2018, 12:21

Ai rành về lập trình Pascal cho em hỏi tý.

Đề bài: Cho số nguyên dương N. Hãy đếm số cách phân tích N thành tổng các số nguyên dương liên tiếp. Ví dụ, nếu N=9 thì có 3 cách phân tích: 9=9. 9=4+5. 9=2+3+4. Input: Nhập từ bàn phím số nguyên dương N ≤ 10 9 Output: Ghi ra màn hình số cách phân tích N thành tổng các số nguyên dương liên ...

Đề bài: Cho số nguyên dương N. Hãy đếm số cách phân tích N thành tổng các số nguyên dương liên tiếp. Ví dụ, nếu N=9 thì có 3 cách phân tích:
9=9.
9=4+5.
9=2+3+4.
Input: Nhập từ bàn phím số nguyên dương N ≤ 109
Output: Ghi ra màn hình số cách phân tích N thành tổng các số nguyên dương liên tiếp.
____________
Em làm như sau:
For i:=1 to n div 2 do
If (2n-i*(i-1)) mod 2*i = 0 then d:=d+1;
Nhưng khi chạy, chương trình của em không thể chạy được những số quá lớn, ví dụ như 9.105. Và em lên mạng xem lời giải thì như thế này:
max:=Trunc((1+sqrt(1+8.0*n))/2);
For i:=1 to max do
If (i*(i-1)<2*n) and ((2*n-i*(i-1) mod 2*i = 0) then d:=d+1;
___________
Cho em hỏi cái chỗ (i*(i-1)<2*n) để làm gì? Và vì sao có thể biết chỉ cần chạy đến Trunc((1+sqrt(1+8.0*n))/2) là đã đủ trường hợp rồi. Em đã nháp, cố chứng minh đủ kiểu nhưng vẫn ko hiểu 2 chỗ đó.<Cần lắm 1 cao nhân giải thích cặn kẽ.> .
0