HomeĐề Thi học sinh giỏi

Đề luyện thi HSG tin học lớp 9 – Pascal – Đề số 2

Like Tweet Pin it Share Share Email
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ố 2


Bài làm của Minh

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

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[i]);
  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[i]<-32000) OR (a[i]>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[i] THEN max:=a[i];          
  num:=a[1];                   
  {Gan cho num gia tri be nhat}
  FOR i:=2 TO n DO
    IF num>a[i] THEN num:=a[i];
  {Tim so lon nhi}
  FOR i:=1 TO n DO
    IF (num<a[i]) AND (a[i]<max) THEN num:=a[i];
  {Xac dinh truong hop No solution}
  ok:=FALSE;
  FOR i:=1 TO n DO
   IF num<>a[i] 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é.
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ĩ.

Comments (0)

Trả lời

Your email address will not be published. Required fields are marked *