Like và share giúp mình phát triển website nhé.
Đề luyện thi HSG tin học lớp 9 – Pascal – đề số 1
Bài làm của Minh
PROGRAM nguyento; USES crt; VAR ok:BOOLEAN; n,i:LONGINT; f:TEXT; PROCEDURE tim(i:LONGINT); VAR j:LONGINT; BEGIN ok:=TRUE; FOR j:=2 TO i-1 DO IF i MOD j = 0 THEN ok:=FALSE; END; BEGIN clrscr; assign(f,'NGUYENTO_INP.txt'); reset(f); read(f,n); close(f); assign(f,'NGUYENTO_OUT.txt'); rewrite(f); IF n<2 THEN write(f,'khong co so nguyen to nao') ELSE BEGIN FOR i:=2 TO n DO BEGIN tim(i); IF ok THEN write(f,i,' '); END; END; close(f); END.
Nhận xét bài 1:
- Em làm tương đối tốt tuy nhiên để tối ưu chương trình con “tim” (Tìm số nguyên tố) thì em chỉ cần cho j chạy từ 2 đến phần nguyên căn bậc hai của i khi đó chương trình sẽ chạy nhanh hơn vì thử ít phép toán hơn. Ta đã áp dụng kiến thức ” Nếu a là số tự nhiên lớn hơn 1 và không có ước thực sự nhỏ hơn căn bậc hai của a thì a là số nguyên tố“
- Trong chương trình em bỏ dòng lệnh USES crt; và clrscr; đi vì bài toán nhận xuất từ file nên không cần xóa màn hình làm gì
PROGRAM chinhphuong; USES crt; VAR f:TEXT; ok:BOOLEAN; n,i:LONGINT; PROCEDURE tim(i:LONGINT); VAR x:REAL; BEGIN ok:=FALSE; x:=sqrt(i); IF frac(x)=0 THEN ok:=TRUE; END; BEGIN clrscr; assign(f,'CPHUONG_INP.txt'); reset(f); read(f,n); close(f); assign(f,'CPHUONG_OUT.txt'); rewrite(f); IF n>=2000000000 THEN write(f,'so ',n,' la qua lon'); IF n<0 THEN write(f,'khong co so chinh phuong nao'); IF n<2000000000 THEN FOR i:=0 TO n DO BEGIN tim(i); IF ok THEN write(f,i,' '); END; close(f); END.
Nhận xét bài 1:
- Em làm tương tốt thầy thích cái cách mà em sử dụng hàm Frac(x) : cho kết quả là phần thập phân của số x.
- Trong chương trình em bỏ dòng lệnh USES crt; và clrscr; đi vì bài toán nhận xuất từ file nên không cần xóa màn hình làm gì
PROGRAM mahoa; USES crt; VAR f:TEXT; n,vt,i:BYTE; s,ss:STRING; ch:CHAR; BEGIN clrscr; assign(f,'MAHOA_INP.txt'); reset(f); readln(f,n); read(f,s); close(f); assign(f,'MAHOA_OUT.txt'); rewrite(f); ss:=''; FOR i:=1 TO length(s) DO BEGIN vt:=ord(s[i]); IF (vt>=65) AND (vt<=90) THEN BEGIN vt:=vt+n; IF vt>90 THEN vt:=vt-90+64 END; IF (vt>=97) AND (vt<=122) THEN BEGIN vt:=vt+n; IF vt>122 THEN vt:=vt-122+96 END; ss:=ss+chr(vt); END; writeln(f,n); write(f,ss); close(f); END.
PROGRAM giaima; USES crt; VAR f:TEXT; n,vt,i:BYTE; s,ss:STRING; ch:CHAR; BEGIN clrscr; assign(f,'GIAIMA_INP.txt'); reset(f); readln(f,n); read(f,s); close(f); assign(f,'GIAIMA_OUT.txt'); rewrite(f); ss:=''; FOR i:=1 TO length(s) DO BEGIN vt:=ord(s[i]); IF (vt>=65) AND (vt<=90) THEN BEGIN vt:=vt-n; IF vt<65 THEN vt:=90-(65-vt)+1 END; IF (vt>=97) AND (vt<=122) THEN BEGIN vt:=vt-n; IF vt>122 THEN vt:=122-(97-vt)+1 END; ss:=ss+chr(vt); END; writeln(f,n); write(f,ss); close(f); END.
Nhận xét bài 3, bài 4:
Em làm như vậy thì em phải nhớ ý nghĩa các con số 65, 90, 122,… nếu giả sử vào phòng thi mình quên nó thì sao nhỉ, hãy thử tìm cách để không phải nhớ những số đó!!
Xin cảm ơn những ý kiến của thầy, nó giúp em cải thiện hơn trong thuật toán của mình