Bài 1: Hoán vị ( 3 điểm)
Tên file bài làm là: bailam1.pas
Viết chương trình liệt kê tất cả các hoán vị của tập {1, 2, ., n}
Ví dụ : Khi nhập dữ liệu vào là 3
Dữ liệu xuất ra của các hoán vị là
1 2 3
UBND THÀNH PHỐ HỘI AN PHÒNG GIÁO DỤC& ĐÀO TẠO ---------- ĐỀ CHÍNH THỨC ĐỀ THI HỌC SINH GIỎI NĂM HỌC 2010-2011 Môn: Tin học 9 Thời gian làm bài: 150 phút (Không kể thời gian giao đề) Bài 1: Hoán vị ( 3 điểm) Tên file bài làm là: bailam1.pas Viết chương trình liệt kê tất cả các hoán vị của tập {1, 2, ..., n} Ví dụ : Khi nhập dữ liệu vào là 3 Dữ liệu xuất ra của các hoán vị là 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 Bài 2: Số nguyên tố ( 3 điểm) ( 3 điểm ) Tên file bài làm là: bailam2.pas Với mỗi số tự nhiên N ( 1 £ N £ 1000). Tìm các số tự nhiên M £ N thoả mãn: +/ M là một số nguyên tố. +/ Tổng các chữ số của M cũng là một số nguyên tố. Yêu cầu: Nhập số tự nhiên N (1 £ N £ 1000). Thông báo số lượng các số tự nhiên M thỏa mãn các yêu cầu trên, đó là các số nào? Dữ liệu vào Số tự nhiên N Dữ liệu ra Dòng 1: Ghi các số M thỏa mãn yêu cầu Dòng 2: Số lượng các số tự nhiên M thỏa mãn Ví dụ: Dữ liệu vào 10 Dữ liệu ra 2 3 5 7 4 Bài 3 :Số bền( 4 điểm) Tên file bài làm là: bailam3.pas Năm 1973, nhà Toán học Neil Sloan đưa ra khái niệm độ bền của một số nguyên không âm N như sau: Nếu N có một chữ số thì độ bền của N bằng 0. Nếu N có từ 2 chữ số trở lên thì độ bền của N bằng độ bền của số nguyên là tích các chữ số của N cộng 1. Cho N, tính độ bền của N. Dữ liệu vào từ file văn bản: sobent.inp Dòng 1: Số nguyên N (0 ≤ N ≤ 2.000.000.000). Kết quả ghi ra file văn bản: soben..out Dòng 1: Số nguyên là độ bền của N. Ví dụ soben.inp soben.out Giải thích 99 2 Doben(99)=Doben(81)+1=Doben(8)+1+1=0+1+1=2 -----------------------------o0o----------------------------------- Cán bộ coi thi không giải thích gì thêm. HƯỚNG DẪN CHẤM TIN HỌC 9 NĂM HỌC 2010-2011 Đáp án bài 1: ( 3 đ) program hoanvi; uses Crt; var kt:array[1..50] of boolean;n:byte; x:array[1..50] of byte; -----------------------------------------> 0,5đ procedure try(j:byte);var k,i:byte; begin for i:=1 to n do if kt[i] then begin x[j]:=i; kt[i]:=false; if j=n then begin for k:=1 to n do write(x[k]:4); writeln; end else try(j+1); kt[i]:=true; end; end; ------------------------------------------> 1 đ procedure lietke(n:byte);var i:byte; begin for i:=1 to n do kt[i]:=true; try(1); end; -------------------------------------------> 1đ begin writeln('nhap so chu so can hoan vi'); readln(n); writeln('cac hoan vi la:'); lietke(n); readln; end. --------------------------------------------> 0,5 đ =================================================== Đáp án bài 2 ( 3 đ) Program bai2; Var m,n,i,j,k,d:Longint; Function nto(n:Longint):Longint; Var i:Longint; Begin d:=0; For i:=2 to n div 2 do If N mod i = 0 then Inc(d); If (d=0)and(n1) then nto:=n; End; ---------------------------------------------------------> 0,75 đ Function Sum(m:Longint):Longint; Var s:Longint; Begin s:=0; Repeat s:=s+ m mod 10; m:= m div 10; Until m=0; Sum:=s; End; ---------------------------------------------------------> 0,75 đ Procedure XULI; Var n,d:Longint; Begin Write(' N= '); Readln(N); if (n>=1) and (n<=1000) then begin d:=0; For i:= 2 to N do If (nto(i)=i)and(nto(Sum(i))=Sum(i)) then Begin Inc(d); Write(i:5); End; Writeln; Writeln(' TIM THAY ',d:5,' SO THOA MAN'); End else write('0'); END; Begin XULI; Readln; End. ----------------------------------------------------------> 1,5 đ =================================================================== program bai3 ( 4 đ) Var f,g:text; d,n:longint; Function tich(x:longint):longint; Var s,a:longint; -----------------------------------------------------------------------> 1 đ Begin s:=1; repeat a:=x mod 10; x:=x div 10; s:=s*a; until x=0; tich:=s; End; ------------------------------------------------------------------------> 1 đ BEGIN Assign(f,'soben..inp'); Reset(f); Assign(g,'soben.out'); Rewrite(g); Read(f,n); d:=0; While n>9 do begin inc(d); n:=tich(n); end; ---------------------------------------------------------------------------> 1,5 đ Write(g,d); Close(g); Close(f); END. ---------------------------------------------------------------------------> 0,5 Trong quá trình chấm giám khảo căn cứ vào kết quả thực hiện được trên máy để cho điểm tối đa. Nếu chương trình không chạy được thì mới rà soát lại quá trình từng thao tác của thí sinh để cho điểm những ý mà thí sinh làm được. COPY RA ĐỂ CHẠY THỬ TRÊN MÁY Đáp án bài 1: program hoanvi; uses Crt; var kt:array[1..50] of boolean;n:byte; x:array[1..50] of byte; procedure try(j:byte);var k,i:byte; begin for i:=1 to n do if kt[i] then begin x[j]:=i; kt[i]:=false; if j=n then begin for k:=1 to n do write(x[k]:4); writeln; end else try(j+1); kt[i]:=true; end; end; procedure lietke(n:byte);var i:byte; begin for i:=1 to n do kt[i]:=true; try(1); end; begin writeln('nhap so chu so can hoan vi'); readln(n); writeln('cac hoan vi la:'); lietke(n); readln; end. =================================================== Đáp án bài 2 Program bai2; Var m,n,i,j,k,d:Longint; Function nto(n:Longint):Longint; Var i:Longint; Begin d:=0; For i:=2 to n div 2 do If N mod i = 0 then Inc(d); If (d=0)and(n1) then nto:=n; End; Function Sum(m:Longint):Longint; Var s:Longint; Begin s:=0; Repeat s:=s+ m mod 10; m:= m div 10; Until m=0; Sum:=s; End; Procedure XULI; Var n,d:Longint; Begin Write(' N= '); Readln(N); if (n>=1) and (n<=1000) then begin d:=0; For i:= 2 to N do If (nto(i)=i)and(nto(Sum(i))=Sum(i)) then Begin Inc(d); Write(i:5); End; Writeln; Writeln(' TIM THAY ',d:5,' SO THOA MAN'); End else write('0'); END; Begin XULI; Readln; End. =================================================================== program bai3 Var f,g:text; d,n:longint; Function tich(x:longint):longint; Var s,a:longint; Begin s:=1; repeat a:=x mod 10; x:=x div 10; s:=s*a; until x=0; tich:=s; End; BEGIN Assign(f,'soben..inp'); Reset(f); Assign(g,'soben.out'); Rewrite(g); Read(f,n); d:=0; While n>9 do begin inc(d); n:=tich(n); end; Write(g,d); Close(g); Close(f); END.
Tài liệu đính kèm: