Giải Bài Pascal [Archive] - Diễn Đàn Tin Học

Diễn Đàn Tin Học > Lập trình > Các ngôn ngữ lập trình > Pascal/Delphi/Kylix > Giải bài Pascal PDA

View Full Version : Giải bài Pascal

lehang_gb111-07-2009, 22:11Cho xâu X có n kí tự chữ số. Hãy xoá đi k kí tự để xâu còn lại có giá trị nhỏ nhất. VD1: X='89678982' X có 8 kí tự, xoá đi 5 kí tự để còn 3 kí tự Xâu đáp số là '672' VD2: X='70358' X có 5 kí tự. Xoá đi 3 kí tự để còn 2 kí tự Xâu đáp số là '03' bld12-07-2009, 11:33tìm trong xâu s[1..n-k] kí tự nhỏ nhất,đặt làm s[1] giả sử có vị trí j , tìm tiếp trong s[j..n-k+1], ta được s[2], cứ tiếp tục cho đến khi tìm được k tí tự , thì các kí tự không được chọn cần xoá đi ghostknight12-07-2009, 12:10tìm trong xâu s[1..n-k] kí tự nhỏ nhất,đặt làm s[1] giả sử có vị trí j , tìm tiếp trong s[j..n-k+1], ta được s[2], cứ tiếp tục cho đến khi tìm được k tí tự , thì các kí tự không được chọn cần xoá đi code này bị lỗi nếu S[i]=min và i=N. theo ý mình thì phải là tìm trong xâu s[1..n-k] kí tự nhỏ nhất S[i] với N-i>=3 còn phần sau thì giống của bld. @lehang: theo mình thì bạn post tất cả các bài vào 1 topic đi, cứ post tràn lan như vậy nó loãng topic ra, h vào toàn thấy topic của bạn thôi ah:| bld12-07-2009, 12:48code này bị lỗi nếu S[i]=min và i=N. theo ý mình thì phải là tìm trong xâu s[1..n-k] kí tự nhỏ nhất S[i] với N-i>=3 còn phần sau thì giống của bld. @lehang: theo mình thì bạn post tất cả các bài vào 1 topic đi, cứ post tràn lan như vậy nó loãng topic ra, h vào toàn thấy topic của bạn thôi ah:| i không bao giờ = N bạn à : chỉ xét i từ 1..n-k ,, làm sao có thể bằng N được ! bạn giải thích tại sao N-i>=3 đi ( số 3 ở đâu thế nhỉ ? :) ) ghostknight12-07-2009, 13:59i không bao giờ = N bạn à : chỉ xét i từ 1..n-k ,, làm sao có thể bằng N được ! bạn giải thích tại sao N-i>=3 đi ( số 3 ở đâu thế nhỉ ? :) ) sr, k đọc kỹ đề,đọc nhầm ví dụ thành đề bài :| tưởng là xóa để còn lại số có 3 chữ số cuối cùng là nhỏ nhất lehang_gb112-07-2009, 18:06tìm trong xâu s[1..n-k] kí tự nhỏ nhất,đặt làm s[1] giả sử có vị trí j , tìm tiếp trong s[j..n-k+1], ta được s[2], cứ tiếp tục cho đến khi tìm được k tí tự , thì các kí tự không được chọn cần xoá đi Tại sao lại tìm trong xâu S[1..n-k] mà không la daon khác ví dụ trong S[1..k] ha [=========> Bổ sung bài viết <=========] Ví dụ như bạn bld thì với dãy số sau: 3 9 4 2 1 1 Xóa đi 3 kí tự để còn 3 kí tự thì đáp số là 2 1 1 Nhưng theo bạn thì xét từ số thứ 1 đến số thư 3 min là 3 và tiếp tục tìm tiếp từ thì kết quả là 311 Theo mình sửa đi 1 chút là tìm trong xâu S[1..n-k+1] kí tự min giả sử có vị trí là j, tìm tiếp trong S[j+1..n-k+2]. ah xét thêm th số 0 nữa vì chữ số đứng đầu không là số 0 được bld12-07-2009, 20:06yes! cảm ơn , mình đã không tính toán kĩ trước khi trả lời :) linhberos12-07-2009, 20:34Mình xin đóng góp 1 cách như sau. Mọi người góp ý thêm nha uses crt; var a : array[1..20] of integer; i,j,n,code,tg,k: integer; s : string[50]; begin Clrscr; write('Nhap xau: ');readln(s); writeln;writeln('Xau la: ',s); {Doi thanh so} n:=length(s); for i:=1 to length(s) do val(s[i],a[i],code); for i:=1 to n-1 do for j:=i+1 to n do if a[i]>a[j] then begin tg:=a[i];a[i]:=a[j];a[j]:=tg; end; writeln;writeln; for i:=1 to n do write(a[i]); writeln; writeln('Nhap so ki tu can xoa: ');readln(k); writeln;writeln('Thu duoc xau co gia tri lon nhat la');writeln; for i:=1 to n-k do write(a[i]); Readln; end. http://i264.photobucket.com/albums/ii185/linhberos/1-1.jpg bld12-07-2009, 20:39font lạ nhỉ ^^? nhưng cách không đúng , phải là dãy nghiêm ngặt về chỉ số bạn à bạn sắp xếp lại xâu thì còn gì là thao tác xoá nữa thao tác xoá phải đảm bảo các phần tử khác được giữ nguyên về mặt chỉ số vẫn đảm bảo số đứng trước vẫn còn đứng trước , số đứng sau vẫn còn đứng sau hang_vt13-07-2009, 19:26const fi='ERASE.INP'; fo='ERASE.OUT'; var f:text; s:string; k:byte; procedure inp; begin assign(f,fi); reset(f); readln(f,s); readln(f,k); close(f); end; procedure sol; var i,j:byte; st,x:string; begin for i:=1 to k do begin st:=s; for j:=1 to length(s) do begin x:=s; delete(x,j,1); if st>x then st:=x; end; s:=st; end; end; procedure pri; begin assign(f,fo); rewrite(f); writeln(f,s); close(f); end; begin inp; sol; pri; end. [=========> Bổ sung bài viết <=========] cách # : uses crt; var s:string; i,j,k,n:integer; procedure inp; begin clrscr; write('S= '); readln(s); n:=length(s); write('K= '); readln(k); end; procedure sol; begin s:=s+'0'; repeat inc(i); if s[i]>s[i+1] then begin delete( s, i, 1); dec(i,2); inc(j); end; until (j=k) or (i=n+1); delete(s,length(s),1); end; procedure pri; begin write(s); readln; end; begin inp; sol; pri; end. lehang_gb116-07-2009, 22:52Mơi dầu đoch bài của bạn hang_vt chưa hiểu . ĐỌc xong chạy, hiểu thấy hay. Sử dung phép so sanh 2 xâu có độ dài khác nhau hang_vt17-07-2009, 19:062 code 2 ý tưởng khác hẳn nhau đấy - code 1 thì nhờ Hiếu giải thix dùm - code 2 : cho chạy từ đầu xâu -> cuối xâu , nếu số nào lớn hơn số phía sau thì xóa vd : 321698 ( bạn phải ưu tiên xóa số 3 thay vì xóa số 9 ) Chú ý khi xóa phải quay lại xét số trước số đã xóa và số sau số đã xóa vd : 682 , khi xóa số 8 xâu còn 62 . Nếu bạn típ tục tăng i thì sẽ xét số 2 và số sau nó , số 6 sẽ bị bỏ qua -> sai Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.

Từ khóa » Xóa K Chữ Số để được Số Bé Nhất Pascal