1. Trang chủ
  2. » Giáo án - Bài giảng

Mot so cau hoi danh cho HSG Tin hoc 8

11 15 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Nội dung

2.Cho i chạy từ 2 đến n chia 2 lấy phần nguyên, nếu n không chia hết cho bất cứ số nào trong đoạn trên thì là số nguyên tố, ngược lại là không vì một số tự nhiên chỉ chia hết cho các số [r]

(1)BỒI DƯỠNG HỌC SINH GIỎI Ngày 16/4/2014 tiết CHƯƠNG VII CHUYÊN ĐỀ CHIA HẾT – SỐ NGUYÊN TỐ A LÝ THUYẾT: -: -: -: B BÀI TOÁN: Bài tập 7.1 : Nhập vào số nguyên dương n Hãy in số nguyên tố nhỏ lớn n VD: Nhập n = 10 Kết in số 11 Giải thuật : - Gán i := n ; - Thực i là nguyên tố việc tăng i lên Program Nguyen_to; Var n,i:integer; Function NT(n:integer):Boolean; Var ok: Boolean; i: integer; Begin ok:=true; for i:=2 to n-1 if (n mod i)= then ok:=ok and false; if n < then NT:=false else NT:=ok; End; Begin Write('Nhap n: ');Readln(n); i:=n; Repeat i:=i+1; Until NT(i); Write('So nguyen to nho nhat lon hon ',n, 'la: ',i); Readln End Bài tập 7.2 : Nhập vào từ bàn phím số tự nhiên n (n<1000) Hãy phân tích n thành tích các thừa số nguyên tố VD: Nhập vào n = = 3.3 Thuật toán: Gán i := 2; Khi n > thì lặp: Nếu n chia hết cho i thì in i và gán lại n:= n div i Ngược lại tăng i lên Program Phan_tich; var n,i: integer; (2) Begin Write('Nhap so can phan tich: ');Readln(n); i:=2; Write('Ket qua phan tich:'); Write(n,'='); While n>1 Begin if n mod i = then Begin Write(i,'.'); n:= n div i End else i:=i+1; End; Readln End Nhận xét: Cài đặt trên in dư dấu nhân cuối Hãy chỉnh sửa để bỏ dấu nhân thừa này Bài tập 7.3: Tìm các số tự nhiên nhỏ n mà sau làm phép phân tích thừa số nguyên tố có nhiều nhân tử Ví dụ n=9 Các số có nhiều nhân tử sau làm phép phân tích là: = 2.2.2 Thuật toán: Cài đặt: Program Phan_tich_nguyen_to_2; Var n, Max, so, i:byte; Function PTNT(n:integer):byte; Var i,p:byte; Begin i:=2; p:=0; While n>1 if (n mod i)=0 then Begin p:=p+1; n:=n div i end else i:=i+1; PTNT:=p; End; Procedure PT(n:integer); Var i:byte; Begin i:=2; While n>1 if (n mod i)=0 then Begin Write(i,'.'); n:=n div i end else i:=i+1; End; Begin Write('Nhap so n: ');Readln(n); Max:=0; For i:= to n if PTNT(i)>=Max then Begin Max:=PTNT(i); So:=i End; Write('So ',So,' co nhieu uoc nhat,',so,' = '); PT(So); Readln (3) End Program Tong_nguyen_to; Var i,n:integer; Function NT(n:integer):Boolean; Var ok: Boolean; i:integer; Begin ok:=true; For i:=2 to n-1 if (n mod i) = then ok:=ok and false; if n>=2 then NT:=ok else NT:=false; End; Begin Write('Nhap so n: ');Readln(n); For i:=2 to n div if (NT(i) and NT(n-i)) then Writeln(n,' = ',i,' + ',n-i); Readln End Nhận xét: Hãy mở rộng bài toán theo hướng - Xét xem đoạn [n1 n2] số nào cho phép tách thành tổng hai số nguyên tố nhiều trường hợp - Tách số thành tổng ba số nguyên tố Bài tập 7.6: (Tin học trẻ toàn quốc lần I - 1995) Hai số tự nhiên A, B coi là hữu nghị số này tổng các ước số số và ngược lại Lập trình tìm và chiếu lên màn hình các cặp số hữu nghị phạm vi từ đến 10000 (Lưu ý: số coi là ước số số còn số không coi là ước số chính nó) Thuật toán: Cài đặt: Program Cap_so_huu_nghi; Var a,b,n,i:integer; Function TU(a:integer):integer; Var Tg,i:integer; Begin Tg:=0; For i:=1 to a-1 if (a mod i = 0) then Tg:=Tg + i; TU:=Tg; End; Begin Write('Nhap so n: ');Readln(n); For a:=1 to n Begin b:=TU(a); if TU(b)=a then Writeln(a,'-',b) end; Readln; End (4) Số nguyên tố: Các thuật toán kiểm tra số nguyên tố: 1.Cho i chạy từ đến n thì đếm xem n chia hết cho bao nhiêu số nhỏ n (tức là i), n chia hết cho số thì là số nguyên tố, trên hai số thì không phải 2.Cho i chạy từ đến n chia lấy phần nguyên, n không chia hết cho số nào đoạn trên thì là số nguyên tố, ngược lại là không (vì số tự nhiên chia hết cho các số từ đến đoạn nó thôi) Còn nhiều thuật toán tìm số nguyên tố khác bạn tự tìm hiểu nha Ở đây mình viết theo cách cho bạn dễ hiểu và hình dung hơn: USES crt; VAR n,i,a:INTEGER; BEGIN clrscr; write('nhap n:=');readln(n); a:=0; FOR i:=2 TO n DO IF (n MOD i =0) THEN a:=a+1; IF a<=2 THEN writeln(n,' la so nguyen to') ELSE writeln(n,' khong phai la so nguyen to') ; readln; END Cách 2: program kiem_tra_nguyen_to; uses crt; var n,i:integer; bl:boolean; begin clrscr; bl:=true; write('nhap vao so can kiem tra tinh nguyen to: '); readln(n); if n<=1 then bl:=false; for i:=2 to trunc(sqrt(n)) then if n mod i=0 then bl:=false; if bl=true then write('so vua nhap nguyen to.') else write('so vua nhap khong nguyen to.'); readln; end Số hoàn hảo: kiểm tra số hoàn hảo program ktsohoanhao; uses crt; var i,n,t:integer; begin clrscr; t:=0; for i:=1 to n-1 if (n mod i) =0 then t:=t+i; (5) if (n=t) then write('n la so hoan hao'); readln; end số chính phương Số chính phương là gì? Số chính phương là số mà tự nó là bậc hai số tự nhiên khác, hay nói rõ thì số chính phương là bình phương số tự nhiên Ví dụ: 289 là số chính phương vì 289 = 17 bình phương Thuật toán Pascal đây giúp tìm số chính phương mảng chiều uses crt; type ArrInt = array[1 250] of integer; Var n,i,x : integer; a: ArrInt; BEGIN clrscr; write('Nhap so phan tu: '); readln(n); for i:=1 to n begin write('Phan tu thu ',i,'= '); readln(a[i]); end; writeln('Cac so chinh phuong co mang:'); for i:=1 to n begin x:=trunc(sqrt(a[i])); if sqr(x)=a[i] then write(a[i]:4); end; readln; END Trong đó lệnh hàm sqrt để lấy và hàm trunc để lấy phần nguyên (6) Bài: Viết chương trình tính các tổng sau: S0 = n! = 1*2* *n {n giai thừa} S1 = + 1/2 + + 1/n S2 = + 1/2! + + 1/n! S3 = + x + x2/2! + x3/3! + + xn/n! S4 = - x + x2/2! - x3/3! + + (-1)nxn/n! S5 = + sin(x) + sin2(x) + + sinn(x) Ý tưởng: Lấy số lớn số trừ Lặp lại thao tác đến nào số -> UCLN Lấy tích số chia cho UCLN -> BCNN Thuật toán tìm Bội chung nhỏ và Ước chung lớn số Pascal: Cách 1: Dưới đây là thuật toán tìm UCLN cách trừ nhau, trình bày SGK tin học 10 var x,y,UCLN,BCNN:integer; begin readln(x,y); BCNN:=x*y; While x<>y If x>y then x:=x-y else y:=y-x; UCLN:=x; BCNN:=BCNN div UCLN; write(UCLN,' ',BCNN); end Cách 2: Thuật toán Euclide: Ngoài cách tìm UCLN trên Các bạn có thể sử dụng cách chia lấy dư (mod), chương trình tối ưu phải thực ít phép tính Ý tưởng: UCLN số x, y là UCLN số y và x mod y, ta đổi x là y, y là x mod y y Khi đó UCLN là x var x,y,UCLN,BCNN,t:integer; begin readln(x,y); BCNN:=x*y; t:= y mod x; (7) While t <> Begin t:= x MOD y; x:= y; y:= t; End; ucln:=x; BCNN:=BCNN div UCLN; write(UCLN,' ',BCNN); end Cách 3: Tìm UCLN cách dùng đệ quy: Đệ quy hiểu đơn giản là gọi nhiều lần chương trình chương trình Thực sự, bài toán đơn giản, không sử dụng đệ quy vì làm phức tạp vấn đề và làm chương trình trở nên rắc rối, phải thực nhiều phép tính Tuy nhiên, bắt buộc phải dùng đệ quy, các bạn có thể tham khảo cách làm đây: function ucln(x,y:integer):integer; begin if x = y then ucln:=x else if x > y then ucln:=ucln(x mod y,y) else ucln:=ucln(x, y mod x); end; var x,y:integer; begin readln(x,y); write('Ước chung lớn là: ', UCLN(x,y), ' Bội chung nhỏ là: ', (x*y) div UCLN(x,y)); end Thuật toán Pascal đây giúp tìm số chính phương mảng chiều uses crt; type ArrInt = array[1 250] of integer; Var n,i,x : integer; a: ArrInt; (8) BEGIN clrscr; write('Nhap so phan tu: '); readln(n); for i:=1 to n begin write('Phan tu thu ',i,'= '); readln(a[i]); end; writeln('Cac so chinh phuong co mang:'); for i:=1 to n begin x:=trunc(sqrt(a[i])); if sqr(x)=a[i] then write(a[i]:4); end; readln; END (9) Xâu là gì? Để xử lý các chuỗi văn bản, Pascal đưa kiểu liệu gọi là xâu ký tự và định nghĩa từ khóa STRING Xâu ký tự là liệu bao gồm dãy các ký tự bảng mã ASSCII (10) Cách khai báo: Var: STRING[độ dài xâu]; Xâu ký tự nhớ nó chiếm số byte số ký tự cực đại khai báo cộng với byte đầu tiên chứa số ký tự có xâu Độ dài tối đa xâu ký tự là 255 - Cách nhập/xuất: Cách đọc hay viết kiểu STRING tương tự các kiểu liệu khác, ta sử dụng các thủ tục READ, WRITE Ví dụ: Readln(st); Writeln(st); - Truy cập phần tử xâu ký tự: tương tự mảng chiều: thông qua tên biến kiểu STRING và số nó Ví dụ: St := 'Le Thanh Lam'; write(st[4]); -> Kết quả: cho chữ T Các thao tác trên xâu ký tự: 1/ Phép cộng xâu: Ví dụ: st1:=’Le’; st2:=’Thanh’; St=st1 + st2; -> KQ: ‘Le Thanh’ 2/ Phép so sánh: Hai xâu ký tự có thể so sánh với các phép so sánh =, >, <… Nguyên tắc so sánh thực sau, chúng đem ký tự tương ứng với để so sánh, xâu nào có ký tự có số thứ tự bảng mã ASCII lớn thì xâu đó lớn Hai xâu ký tự gọi là chúng hoàn toàn giống (có độ dài nhau) Ví dụ: ‘FILENAME’ = ’FILENAME ‘ 3/ Các thủ tục và hàm chuẩn xử lý xâu ký tự a Hàm length(st): cho độ dài thực xâu ký tự ví dụ: st:=’le thanh’ thì LENGTH(st) cho b/ Thủ tục DELETE(st, pos, num): xóa num ký tự xâu st kể từ vị (11) trí pos Ví dụ: st= ‘FILENAME’ Delete(st,5,4) lúc đó st cho là ‘FILE’ c/ Thủ tục INSERT(obj, st, pos): Thủ tục cho kết cách chèn xâu ký tự có tên là Obj vàoxâu st vị trí pos, ký tự đứng sau pos dời vềphía sau xâu ký tự obj Ví dụ: obj:= ‘Thanh ‘ st:=’Le Lam’; INSERT(obj,st,4) lúc đó st=’Le Thanh Lam’; d/ Thủ tục STR(value, st): Thủ tục này thực việc chuyển đối giá trị kiểu số(value) sang dạng xâu ký tự và gán cho biến st Ví dụ: n là só nguyên có giá trị: n:=150; STR(n:5,st) cho kết xâu st là: st=’ 150’; e/ Thủ tục VAL(st, value,code) đối xâu ký tự st sang dạng số và gán cho biến value, biến đối thành công thì code nhận giá trị ngược lại thì cho giá trị khác không Ví dụ: VAL(‘123’,value,code) lúc này code nhận giá trị và value=123 f/ Hàm COPY(st, pos, num): chép xâu st, num ký tự vị trí pos, Ví dụ: st=’Le Thanh Lam’ COPY(st,4,5) = ‘Thanh’; g/ Hàm CONCAT(s1,s2,…,sn): hàm cho xâu cách nối đuôi các xâu s1,s2,…,sn lại với Ví dụ: CONCAT(‘Le ’,’Thanh ‘, ‘Lam’) = ‘Le Thanh Lam’; h/ Hàm POS(st1,st2): hàm cho tavị trí tìm thấy đầu tiên xâu s1 xâu s2 Ví dụ: POS(‘Lam’,‘Le Thanh Lam’) = 10; (12)

Ngày đăng: 10/09/2021, 05:20

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w