Chào mừng!

ĐĂNG KÝ THÀNH VIÊN MỚI TẢI ĐƯỢC TÀI LIỆU! Đăng ký ngay!

KHÁCH VÀ THÀNH VIÊN CÓ THỂ TẢI MIỄN PHÍ HƯỚNG DẪN ĐĂNG KÝ THÀNH VIÊN VÀ TẢI » THƯ MỤC MIỄN PHÍYOPOVN
ĐĂNG KÝ NÂNG CẤP THÀNH VIÊN VIP ĐĂNG KÝ NÂNG CẤP THÀNH VIÊN VIP » ĐĂNG KÝ NGAYĐĂNG KÝ NÂNG CẤP THÀNH VIÊN VIP

Yopovn

Ban quản trị Team YOPO
Thành viên BQT
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

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.
Nhận xét: Thuật toán hơi dài nhưng viết theo ý hiểu -> OK
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.
Nhận xét bài số 2: Em làm sai những vấn đề sau:



    • 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ĩ.
 

khaithong

Member
THÀNH VIÊN
Tham gia
30/8/23
Bài viết
2
Điểm
1
Nhờ ad cập nhật lại link. MÌnh không tải được.
 

Yopovn

Ban quản trị Team YOPO
Thành viên BQT
Tham gia
28/1/21
Bài viết
82,315
Điểm
113
tác giả
Nhờ ad cập nhật lại link. MÌnh không tải được.
Link đã die, team sẽ update sớm
 
Nếu bạn cảm thấy nội dung chủ đề bổ ích , Hãy LIKE hoặc bình luận để chủ đề được sôi nổi hơn
  • Từ khóa
    đề thi học sinh giỏi tin 9 đề thi hsg 9 tin học cấp thành phố 2018 đề thi hsg tin 9 đề thi hsg tin 9 cấp huyện có đáp án đề thi hsg tin 9 cấp thành phố đề thi hsg tin 9 cấp tỉnh đề thi hsg tin 9 có đáp án đề thi hsg tin 9 hà nội đề thi hsg tin 9 pascal đề thi hsg tin học 9 cấp huyện đề thi hsg tin lớp 9
  • HỖ TRỢ ĐĂNG KÝ VIP

    Liên hệ ZALO để được tư vấn, hỗ trợ: ĐĂNG KÝ TÀI KHOẢN VIP
    ZALO:0979702422

    BÀI VIẾT MỚI

    Thống kê

    Chủ đề
    36,303
    Bài viết
    37,772
    Thành viên
    140,226
    Thành viên mới nhất
    Linh12
    Top