# GÓC SÁNG TẠO > Khu vực lập trình > Pascal/Delphi/Kylix >  Phân tích số N thành tổng các số liền nhau

## dathoaonline

Nhập vào số nguyên dương N. Đưa ra màn hình các số liên tiếp có tổng bằng N Với số hạng nhiều nhất có thể được. Nếu không có kết quả thì ghi k.
VD1:
Nhập N=15
15 = 1+2+3+4+5
15=4+5+6
kết quả đưa ra 15=1+2+3+4+5 thỏa mãn bài toán 
VD2:Nhập N=8
kết quả: k

----------


## Mai Chi

Bài của bạn anh_sven chưa đáp ứng yêu cầu của tớ. Bạn xem lại nhe!

----------


## lebachit

Đây là chương trình bạn tham khảo nhé!


```
Var f1,f2:text;
i,n,j,s:integer;
Function kt(i:integer):boolean;
Var j,t,k:integer;
Begin
 kt:=false;
 k:=i;
 For j:=1 to n do
   Begin
      t:=i+j;
      k:=k+t;
      if k=n then kt:=true;
   End;
  End;
  BEGIN
  assign(f1,'tu.inp'); reset(f1);
  assign(f2,'mau.inp'); Rewrite(f2);
  read(f1,n);
   For i:=1 to n do
    if kt(i) then
      Begin
        write(f2,'d:',i,' ');
        s:=i;
        Repeat
         inc(i);
         s:=s+i;
         write(f2,i,' ');
         until s=n;
        n:=1;
        End;
    If i=n then write(f2,'k');
    close(f1);
    close(f2);
    End.

```

----------


## nguyennam19

Có một vấn đề là code của chủ topic sai, lỗi biến i do sử dụng trong 2 vòng lặp lồng nhau. Mình nghĩ là một khi bạn đã đưa một chương trình lên thì bạn phải có trách nhiệm với nó [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG] Bạn nói là tham khảo, trong khi chương trình còn không biên dịch được thì bạn muốn bọn mình tham khảo cái gì??? [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]

Đây là code của mình, mình không dám nói là các bạn tham khảo đâu [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG] Mình post lên cho mọi người chạy thử xem mình code có đúng không thôi, đã chạy được với test N = 10^9, và mình cũng chưa thử test cao hơn. Bạn nào có hứng thú thử nghiệm N lớn hơn thì thay một số giá trị longint thành int64 rồi thử xem nhé [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]



```
const
    finp            = 'Earth.inp';
    fout            = 'Shaker.out';

var
    fi, fo          : text;
    N               : longint;
    left, right     : longint;
    found           : boolean;

procedure print(left, right : longint);
var t               : longint;
begin
    write(fo, N, ' = ');
    for t := left to right-1 do
        write(fo, t, '+');
    writeln(fo, right);
end;

procedure Answer;
var sum             : longint;
    t               : longint;
begin
    left := 1;
    right := 1;
    found := false;
    //
    repeat
        sum := (left + right) * (right - left + 1) >> 1;
        if sum > N then
            inc(left)
        else
            if sum < N then
                inc(right)
            else
                if sum = N then
                begin
                    found := true;
                    print(left, right);
                    exit;
                end;
    until right >= N;
    //
    if not found then
        writeln(fo, 'k');
end;

BEGIN
    assign(fi, finp);
    reset(fi);
    assign(fo, fout);
    rewrite(fo);
    readln(fi,N);
    Answer;
    close(fi);
    close(fo);
END.
```

Ngoài lề chút, do bạn lehang_gb1 không nói rõ yêu cầu về dữ liệu ra vào, nên mình đặt tên file theo ý thích [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]) Nếu ai muốn biết thì EarthShaker là một hero trong custom map DotA của War3. Anh em nào biết chơi thì pm, thỉnh thoảng GG tí cho vui [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]

----------


## letien1993

theo minh: pai nay` ta cứ cộng dồn s= 1+ 2 +....+ i neu s >n .thi dung.
rùi tip tuc ta lay s:=s - 1 neu van lon hon thi tru tip den j ,neu s< n thi ko ton tại .nếu s=n thi dừng và in kết quả. 
mới tham gia diển đàn nên còn bở ngỡ , có gì a e chỉ bảo.

----------


## nhatlinhit88

Trong quá trình s-j, sẽ có lúc s<n tuy nhiên nếu + j+1 ... thì có thể = n. Ý tưởng của logic2701 là đúng nhưng cần bổ sung thêm.

----------


## lolem19

trunga0 nói là bài của mình chưa đúng nhưng mình đã chạy và kết quả là đúng, chạy tốt. Mình còn cách khác dễ hiểu hơn, ngăn gọn hơn sẽ post lên sau. NHuưng mình đã xem lại, mình đã phát hiện ra lệnh thay đổi giá trị của biến điều khiển vòng lặp for, vậy mà chương trình chạy vẫn đúng!

----------


## phamthaovnn

Bạn chạy bằng chương trình nào vậy, mình biên dịch bằng Free Pascal và thấy có lỗi ngay.

Mình dùng Free Pascal bản 2.4.0, bản mới nhất rồi. Nên chắc chắn vấn đề không phải ở chương trình dịch. Thậm chí không thể biên dịch được thì làm sao bạn có thể cho nó chạy đúng??? :-?

----------


## thuyvt123

Theo như bài của lehang_gb1 thì bạn đã mắc phải 1 lỗi ở vòng lặp for và repeat. Trong vòng for bạn dùng đến biến i thì bạn không được phép tăng hay giảm biến i. Bạn chỉ được phép lấy giá trị của nó thôi. Nếu có điều chỉnh giá trị thì lập tức báo lỗi. [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]

----------


## hongson1992

chương trình trên mình viết khá rườm rà phức tạp, mình sẽ viết cách đơn giản hơn

----------


## thanhlydongden02

```
[/FONT]
Var A:array[1..100] of integer;
S,N,i,d,m,k,h,j:integer;
Begin
write('Nhap vao so nguyen duong N:'); Readln(N);
i:=1;  d:=0;
while i<=N div 2 do
Begin
k:=i; S:=0; j:=0;
 For h:=k to (N div 2)+1 do
  Begin
     j:=j+1;
    S:=S+h;
    A[j]:=h;
   if S=N then
     Begin
      d:=d+1;
        For m:=1 to j do write(A[m]:3);
        break;
    End
End;
 if S=N then break else
 i:=i+1;
 End;
if d=0 then write('k');
Readln
End.
```

----------


## seotheanhgroup

Chương trình của lehang chạy trên Tp nhưng không bật kiểm tra lỗi thì phải. Nếu bạn để Q+ hay R+ (mình không rõ lắm) thì chắc chắn sẽ thông báo lỗi ngay. Chạy vẫn cho ra kết quả vì Tp bỏ qua 1 số lỗi như tràn, i trong 2 vòng lồng, ... nếu không kiểm tra lỗi.

----------


## muabandienthoai

Tieulong xem lại giú tớ đi vì tớ vừa gõ trên máy dùng Tp chạy chuẩn rồi thì tớ mới post lên!

----------


## seotn

Bạn vào Tp nhé, rồi nhấn Ctrl + O + O (giữ phím Ctrl rồi nhấn 2 lần phím O) để hiện dòng {..} rồi tìm chỗ Q-, R- đổi thành Q+, R+ sau đó F9 thử xem. À mà thử với chương trình có 2 vòng lặp dùng i đồng thời ấy nhá.

----------


## vytieubao

Tieulong ah, nó hiện dòng như thế này, mình chưa hiểu là gì?
{$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q-,R-,S+,T-,V+,X+,Y+}
{$M 16384,0,655360}

----------


## b5fixel

Q+ hình như là để kiểm tra Stack Over Flow, R+ là kiểm tra Range Check Error thì phải. Mình cũng không nhớ rõ lắm. Giá trị mặc định của Turbo Pascal là Q-, R- cho nên muốn kiểm tra những cái đó thì mình phải đặt lại là Q+, R+. Để Q+, R+ thì chương trình sẽ chạy chậm hơn chừng 3 lần, chính vì thế nên lúc đi thi ta chỉ để Q+, R+ lúc test chương trình, còn khi test xong xuôi và nộp bài thì có thể bỏ đi cho chạy nhanh hơn cũng được.

----------


## MinhPhuc123

> Tieulong ah, nó hiện dòng như thế này, mình chưa hiểu là gì?
> {$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q-,R-,S+,T-,V+,X+,Y+}
> {$M 16384,0,655360}


Trong dòng đó có chỗ Q- ,R- đó, bạn chỉnh thành Q+, R+ là xong. Đúng như anh Trung nói chương trình sẽ chạy chậm đi nhưng được cái sẽ kiểm tra chắc chắn có lỗi không, vì thế sẽ an toàn hơn cho code của bạn.

----------


## remcuaminhdang

Có ai biết tác dụng của từng lệnh sau không

regs:registers;
begin
regs.ah:=1;
regs.ch:=bot;
regs.cl:=top;
intr($10,regs);

----------


## fanpckt

```
Var N,j,i,SUM,k:Integer;

BEGIN
        Writeln('Nhap vao so N: ');
        Readln(N);
        j:=1;
        While j < N do
        Begin
                for i:=j to N do
                  Begin
                        SUM:=SUM+i;
                        if SUM=N then
                          break
                        else if SUM>N then
                        Begin
                          SUM:=0;
                          break;
                        End;
                  End;
                if SUM<> 0 then
                        break;
                j:=j+1;
        End;

        if SUM<>0 then
          for k:=j to i do
                Write(k,' ')
        else
         Write('K');
END.
```

Này là cái tui viết naz` anh em sem có Er gì ko ??

----------


## quataovang

Bạn sang thử test n=1 chưa? Mình chưa thử nhưng nghĩ là code bạn thiếu chỗ test đó.

----------


## biankiem174

_ _! Haizz đúng lè mình hay bị chủ quan khi code xong mà thử với mấy cái số to to thấy OK thì lại wen mấy số cơ bản hjz. Thks bạn nhắc nhở sẽ cố gắng khắc phục [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]

----------


## nna19x7

> _ _! Haizz đúng lè mình hay bị chủ quan khi code xong mà thử với mấy cái số to to thấy OK thì lại wen mấy số cơ bản hjz. Thks bạn nhắc nhở sẽ cố gắng khắc phục [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]


[IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG] Sắp thi hsg rồi thì phải cẩn thận chứ, tập test các test đa dạng, đặc biệt đi, chú ý test max, test min.

----------


## noithatductinh

Hong chưa thi mới học lớp 10 thôi [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG] đang tính vô đội tuyển nên chuẩn bị hành trang hihi

----------


## ngobaolac

> Hong chưa thi mới học lớp 10 thôi [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG] đang tính vô đội tuyển nên chuẩn bị hành trang hihi


Lớp 11 mới được thi quốc gia hay sao mà, thi gì sớm thế

----------


## seo.nstech

_ _! Chưa thi mà thời gian còn dài để ngâm cứu hehe
Lúc trước rảnh thì mình chỉ ngâm AutoIT với PHP nên h phải ngâm lại Pascal nên còn nhiều cái chưa ổn lém

----------


## mewevn

@sangpronhat ko bik bạn học lớp nào nhưng muốn vào đt thì pạn còn pđấu nhìu nhìu. Top10 lớp tin(hoặc đt trường ko chuyên) thì ko khó, chứ top3 để thi olympic 30/4 là 1 vấn đề, năm 11 muốn thi qg còn phải đấu vs 11 và 12 toàn tỉnh để vào top6 nữa.

----------


## phukotler5

> Lớp 11 mới được thi quốc gia hay sao mà, thi gì sớm thế


thi olympic 30.4 đó a, dành cho hs lớp 10, 11 kv m.nam, trung và Tây Nguyên. Mỗi tỉnh chọn 6hs(3 lớp10 + 3 lớp11) mỗi môn. Riêng tỉnh e thì chỉ lấy 3 hs đứng đầu lớp chuyên thôi, ko tổ chức thi toàn tỉnh.

----------


## camtuseotop1

Giờ anh mới biết tới kì thi 30.4 :| Vậy sangpronhat cố gắng ôn luyện nhé em, có gì không hiểu có thể lên diễn đàn trao đổi, nhưng tốt nhất chỉ hỏi những gì em chưa hiểu, và đã cố gắng làm nhưng chưa làm được, như thế rất hoan nghênh. Chứ nếu lên để xin code thì không hay đâu. Tự rèn luyện sẽ tốt rất nhiều so với đọc code của người khác (nói cho sang và nói chung cho các mem hay lên diễn đàn xin code nhé).

----------


## kyniemhoctro

Vưng ah. ^^ Lúc trước cấp 2 thì trường em ko dạy PAS hè lớp 9 mới tìm tài liệu tự học thôi tính thi vào chuyên Tin nhưng ba má không cho nên phải đi chuyên toán nhưng mà thực sự e học toán không lại nên xin học tin ^^ ! Trước đó thì mới dọc được giáo trình PAS căn bản thôi hihi lên đây mới kím dc thêm 2 cún muk` hình như kiến thức phổ thông của em chưa đủ để hiểu nó hjzzzz....

----------


## seoomohtx

> Vưng ah. ^^ Lúc trước cấp 2 thì trường em ko dạy PAS hè lớp 9 mới tìm tài liệu tự học thôi tính thi vào chuyên Tin nhưng ba má không cho nên phải đi chuyên toán nhưng mà thực sự e học toán không lại nên xin học tin ^^ !


đam mê có khác, tui ngày xưa đkí thi toán, mẹ bắt bỏ toán thi tin cho chắc đậu, bởi vậy nhiều lúc nản chẳng muốn học tin vì tui sẽ thi đh khối B. Nhưg từ lúc vào dđ lại thấy thích học tin như thích toán mặc dù tin vẫn thuộc loại gà trong lớp.

----------


## ketsat

Mỗi người mỗi cảnh hihi đội tuyển Tin trường e chỉ có 4 5 đứa hà hjz _ _! Ko biết trình độ tụi nó ra sao nữa sợ chen vô mà theo ko kịp bọn nó là ngủm lun hjzz

----------

