- Tham gia
- 28/1/21
- Bài viết
- 82,315
- Điểm
- 113
tác giả
Đề luyện thi HSG tin học lớp 9 – Pascal – Đề số 2 NĂM 2021 - 2022
Đề luyện thi HSG tin học lớp 9 – Pascal – Đề số 2
ĐỀ : https://drive.google.com/file/d/1-4Bvn1wzdVj6bdC-dzaVKkAGf8C9frjq/preview
Bài làm của Minh
Nhận xét: Thuật toán hơi dài nhưng viết theo ý hiểu -> OK
Nhận xét bài số 2: Thuật toán của em đúng nhưng dài quá em có thể suy nghĩ theo những hướng sau để thuật toán ngắn lại hơn:
Nhận xét bài số 2: Em làm sai những vấn đề sau:
Hướng khắc phục:
Em sửa lại và test thử nhé, thầy cũng chưa kiểm tra kĩ.
Đề luyện thi HSG tin học lớp 9 – Pascal – Đề số 2
ĐỀ : https://drive.google.com/file/d/1-4Bvn1wzdVj6bdC-dzaVKkAGf8C9frjq/preview
Bài làm của Minh
Mã:
PROGRAM dong_ho;
USES crt;
VAR n:LONGINT; f:TEXT; m:BYTE;
BEGIN assign(f,'DONGHO_INP.txt'); reset(f); read(f,n); close(f); assign(f,'DONGHO_OUT.txt'); rewrite(f); IF abs(n)>1000000 THEN BEGIN write(f,'n=',n,' la qua lon'); close(f); exit; END; m:=1; IF n>=0 THEN BEGIN m:=n+m; WHILE m>12 DO m:=m-12; END ELSE BEGIN n:=n*-1; WHILE m<=n DO m:=m+12; m:=m-n; END; write(f,m); close(f);
END.
Mã:
PROGRAM tim_so;
USES crt;
VAR n,i:WORD; f:TEXT; a:ARRAY[1..10000] OF INTEGER; num,max:INTEGER; ok:BOOLEAN;
BEGIN assign(f,'TIMSO_INP.txt'); reset(f); readln(f,n); IF n<=10000 THEN FOR i:=1 TO n DO readln(f,a); close(f); assign(f,'TIMSO_OUT.txt'); rewrite(f); {Rang buot du lieu} IF n>10000 THEN BEGIN writeln(f,'n is too large'); close(f); exit; END; FOR i:=1 TO n DO IF (a<-32000) OR (a>32000) THEN BEGIN write(f,'a[',i,'] is too large'); close(f); exit; END; max:=a[1]; {Tim so lon nhat} FOR i:=2 TO n DO IF max<a THEN max:=a; num:=a[1]; {Gan cho num gia tri be nhat} FOR i:=2 TO n DO IF num>a THEN num:=a; {Tim so lon nhi} FOR i:=1 TO n DO IF (num<a) AND (a<max) THEN num:=a; {Xac dinh truong hop No solution} ok:=FALSE; FOR i:=1 TO n DO IF num<>a THEN ok:=TRUE; IF ok THEN write(f,num) ELSE write(f,'No solution'); close(f);
END.
Nhận xét bài số 2: Thuật toán của em đúng nhưng dài quá em có thể suy nghĩ theo những hướng sau để thuật toán ngắn lại hơn:
- Hướng 1: Sắp xếp dãy số từ lớn đến bé giả sử a[1] ; a[2] … . Nếu mảng có ít hơn 2 phần tử hoặc a[2] = a[1] thì No solution còn không thì a[2] là kết quả (Cách suy nghĩ này đơn giản có điều thuật toán phải mất công sắp xếp mảng – nếu dữ liệu nhỏ thì vẫn OK)
- Hướng 2: Em hoàn toàn có thể cải tiến vòng lặp tìm số lớn nhất để nó tìm được luôn số lớn nhì trong đó. Em hãy suy nghĩ để viết lại cho gọn hơn nhé.
Mã:
PROGRAM so_nguyen_to_tuong_duong;
USES crt;
VAR f:TEXT; ok,yes:BOOLEAN; n,m,min,i:WORD;
PROCEDURE NT(so:WORD);
VAR i:WORD;
BEGIN ok:=TRUE; FOR i:=2 TO so-1 DO IF so MOD i = 0 THEN ok:=FALSE;
END;
BEGIN assign(f,'NTTD_INP.txt'); reset(f); read(f,n); read(f,m); close(f); assign(f,'NTTD_OUT.txt'); rewrite(f); yes:=TRUE; IF n>m THEN min:=m ELSE min:=n; FOR i:=2 TO min DO BEGIN ok:=FALSE; IF (n MOD i = 0) OR (m MOD i = 0) THEN NT(i); IF ok THEN IF (n MOD i <> 0) OR (m MOD i <> 0) THEN yes:=FALSE; END; IF yes THEN write(f,'YES') ELSE write(f,'NO'); close(f);
END.
- Chương trình con tìm số nguyên tố em chưa xử lí số 0, 1 vì vậy chương trình này vẫn cho 0, 1 là số nguyên tố em cần nhớ “số nguyên tố là số tự nhiên lớn hơn 1 và không có ước nào khác ngoài 1 và chính nó“. Có vẻ em thích dùng chương trình con PROCEDURE thầy thì lại thích dùng FUNCTION trong những trường hợp này (Nhưng không sao tùy sở trường của em). Với thuật toán kiểm tra số n có phải là số nguyên tố không em cũng chỉ cần kiểm tra xem nó có ước nhỏ hơn hoặc bằng căn bậc hai của n thôi bởi nếu n có ước lớn hơn căn bậc hai của n thì cũng có ước nhỏ hơn căn bậc hai của n
- Phần chương trình đoạn xử lí của em rất hay tuy nhiên có lẽ em hiểu chưa đúng, em cần nhớ định nghĩa người ta đưa ra: “Hai số tự nhiên được gọi là Nguyên tố tương đương nếu chúng có chung các ước số nguyên tố” Em đưa vào biến Min = Min(m,n) là chương trình sẽ xử lí sai những trường hợp một trong hai số có ước nguyên tố lớn hơn số kia – em hãy suy nghĩ thật kĩ câu này nhé.
- Một vài VD chương trình sẽ sai (1; 3) ; (5 ; 35) những cặp này không nguyên tố tương đương nhưng chương trình của em chắc chắn sẽ báo YES.
Hướng khắc phục:
- Xử lí trường hợp nhỏ hơn 2 trong chương trình con kiểm tra số nguyên tố
- Có thể thay Min = Min(m,n) bằng Max = Max(m,n) chương trình sẽ đúng
Em sửa lại và test thử nhé, thầy cũng chưa kiểm tra kĩ.