Tải bản đầy đủ - 0 (trang)
2 Thực trạng của vấn đề

2 Thực trạng của vấn đề

Tải bản đầy đủ - 0trang

thốn, thời gian ôn luyện học sinh giỏi cũng chưa được nhiều.

* Điều kiện của giáo viên: Nhà trường có 03 giáo viên tin học đều đạt chuẩn,

tuổi đời trẻ, có năng lực, nhưng ý thức học hỏi để nâng cao trình độ chun mơn

của bản thân còn chưa thực sự tích cực.

* Điều kiện học sinh: Hầu hết học sinh đều là con em ở nông thôn. Nhưng

do kinh tế địa phương những năm gần đây phát triển mạnh, các dịch vụ Internet và

kinh doanh máy tính trên địa bàn cũng phát triển nên học sinh ít nhiều đã được tiếp

cận máy tính và Internet. Mặt khác, đây là môn học mới lại được ứng dụng nhiều

trong thực tế đời sống. Vì vậy, học sinh cũng khá hứng thú và có ý thức với mơn

học nên trong nhiều tiết học các em đều hăng say xây dựng bài và tìm hiểu thực tế

đối với mơn học. Tuy nhiên, đây là mơn học khó đồng thời lại liên quan đến rất

nhiều lĩnh vực khoa học tự nhiên, xã hội nên việc tiếp cận của học sinh cũng tương

đối khó. Kết quả học tập của môn Tin học và kết quả của học sinh giỏi chưa cao.

Kết quả bồi dưỡng học sinh giỏi

Năm học 2015-2016 có 2 giải KK

Năm học 2016-2017 có 2 giải KK

Năm học 2017-2018 có 1 giải nhì, 1 giải ba và 1 giải khuyến khích

2.3. Nội dung và giải pháp thực hiện .

Trước hết tôi đã đưa ra bài toán như sau:

Bài toán gốc: “ Kiểm tra tính nguyên tố của một số nguyên dương ”.

Đây là bài toán cơ bản trong sách giáo khoa tin học lớp 10 mà học sinh đã

tìm hiểu về thuật tốn của bài toán.

Ý tưởng: Một số nguyên dương N là số nguyên tố nếu nó có đúng 2 ước số khác

nhau là 1 và chính nó. Từ đó ta suy ra

- Nếu N=1 thì N khơng là số ngun tố

- Nếu 1
- Nếu N  4 và khơng có ước số trong phạm vi từ 2 đến phần nguyên căn bậc 2 của

N thì N là số nguyên tố.

Chứng minh: Tại sao N không có các ước từ 2 đến phần nguyên căn bậc 2 của N

thì N là số nguyên tố.

Vì nếu N>1 khơng phải là số ngun tố, ta ln có thể tách n=k1 x k2 mà

2 k1 k2 n  1 Vì k1 k1 k1 k 2 n nên k1  n

Do đó, việc kiểm tra với k từ 2 đến n-1 là không cần thiết mà chỉ cần kiểm tra có

tồn tại ước từ 2 đến phần nguyên căn bậc 2 của N.

6



Từ đó ta có thuật tốn sau:

Thuật tốn mô tả theo cách liệt kê như sau:

Bước 1: Nhập số nguyên dương N;

Bước 2: Nếu N = 1 thì thông báo N không nguyên tố rồi kết thúc;

Bước 3: Nếu N < 4 thì thơng báo N là ngun tố rồi kết thúc;

Bước 4: i  2;

Bước 5: Nếu i > [ N ] thì thơng báo N là nguyên tố rồi kết thúc;

Bước 6: Nếu N chia hết cho i thì thơng báo N khơng ngun tố rồi kết thúc;

Bước 7: i  i + 1 rồi quay lại bước 5.

Dưới đây là ví dụ mơ phỏng việc thực hiện thuật toán trên.



Với N = 29 ( �

� 29� 5)





Với N = 45 ( �

� 45� 6 )



I



2



3



4



5



N/i



29/2



29/3



29/4



29/5



Chia

hết

không?



6



Không Không Không Không



a) 29 là số nguyên tố



I



2



3



N/i



45/2



45/3



Chia

hết

không?



Chia hết

Không



b) 45 khơng là số ngun tố



Trên cơ sở thuật tốn ta tiến hành cài đặt thuật toán cho bài toán gốc như sau:

Chương trình 1 :

Function nt(N: longint): boolean;

Var

k, M: integer;

Begin

If N=1 then begin nt:= false; exit end;

If (N=2) or (N=3) then begin nt:=true; exit end;

M:=trunc(sqrt(N));

For k:= 2 to M do

If ( N mod k =0) then begin nt:=false; exit ; end;

nt:=true;

end;

7



Đây là chương trình con kiểm tra 1 số nguyên dương bất kỳ có phải là số

nguyên tố ?

Hàm nt(N) trên tiến hành kiểm tra lần lượt từng số nguyên k trong đoạn từ 2 đến

phần nguyên căn bậc 2 của N. để cải tiến cần giảm thiểu số các số cần kiểm tra.

Thay vì kiểm tra các số k ta sẽ chỉ kiểm tra các số k có tính chất giống tính chất

của số nguyên tố. Vậy tính chất của số nguyên tố như thế nào ?

Tính chất số nguyên tố:

Trừ số 2 và số 3 các số nguyên tố có dạng 6k 1 ( vì các số có dạng 6k 2 thì chia

hết cho 2, 6k  3 thì chia hết cho 3).

Từ đó ta có chương trình con: Kiểm tra 1 số nguyên dương bất kỳ có phải là số

nguyên tố ? áp dụng tính chất số nguyên tố như sau:

Chương trình 2:

function nt(N:longint):boolean;

var k,m,i:longint;

begin

if (N=2) or (N=3) then begin nt:=true; exit; end;

if( (N=1) or (N mod 2=0) or (N mod 3 =0)) then

begin



nt:=false; exit; end;



k:= -1;

M:=trunc(sqrt(N));

repeat

inc(k,6);

if (N od k =0) or (n mod (k+2) = 0) then break;

until k>M

if k>Mthen nt:=true

else nt:=false;

end;

Như vậy để có thể giải quyết các bài toán về số nguyên tố trong lập trình với dữ

liệu lớn ta đi theo hướng xây dựng chương trình cho bài tốn gốc với sự lựa chọn

chương trình 2.

Với cách viết chương trình cho bài tốn gốc với chương trình dạng 2. Ta có

thể sử dụng dữ liệu với số nguyên dương N là rất lớn khơng chỉ là kiểu dữ liệu

longint mà thay vào đó là dữ liệu kiểu int64 cụ thể như sau:

8



function nt(N:int64):boolean;

var k,m,i:longint;

begin

if (N=2) or (N=3) then begin nt:=true; exit; end;

if( (N=1) or (N mod 2=0) or (N mod 3 =0)) then

begin



nt:=false; exit; end;



k:= -1;

M:=trunc(sqrt(N));

repeat

inc(k,6);

if (N od k =0) or (n mod (k+2) = 0) then break;

until k>M

if k>Mthen nt:=true

else nt:=false;

end;



2.3.2 Các dạng bài toán về số nguyên tố

Bài toán 1: Viết chương trình liệt kê các số nguyên tố trong đoạn từ [2,N]

Dữ liệu vào: Tệp văn bản nguyento.inp chứa duy nhất số nguyên dương N

Kết quả: Ghi vào tệp văn bản nguyento.out các số nguyên tố, mỗi số cách nhau ít

nhất 1 kí tự trống. Ghi trên cùng 1 dòng.

Ý tưởng bài toán này như sau:

-Xây dựng hàm nguyên tố..

- Xây dựng chương trình con liệt kê các số nguyên tố trong đoạn từ 2 đến phần

nguyên N . Bằng cách sử dụng lời gọi hàm nt(i). Nếu hàm nt(i) (trong đó i nhận

giá trị từ 2 đến N) nếu hàm nhận giá trị đúng thì giá trị i được ghi vào tệp write(f2,

i,’ ‘).

Thơng qua đoạn chương trình:

For i:=2 to N do

If nt(i) then write(f2, i, ‘ ‘);

9



Chương trình cụ thể với bài toán 1:

const fi='nguyento.inp';

fo='nguyento.out';

var n,m, i:longint;

f1,f2:text;

procedure doctep;

begin

assign(f1,fi); reset(f1);

assign(f2,fo); rewrite(f2);

read(f1,n);

end;

function nt(n:int64):boolean;

var k, M:longint;

begin

if (n=2) or (n=3) then begin nt:=true; exit; end;

if (n=1) or (n mod 2=0) or (n mod 3=0) then begin nt:=false; exit ; end;

M:=trunc(sqrt(n));

K:=-1;

Repeat

Inc(k,6);

if (n mod k=0) or (n mod (k+2)=0) then begin break;

until k>M;

if k>m then nt:=true else nt:=false;

end;

procedure xuly;

begin

for i:=2 to n do if nt(i) then write(f2,i,' ');

end;

procedure dongtep;

begin

close(f1); close(f2);

10



end;

begin

doctep;

xuly;

dongtep;

end.

Bài toán 2:



Số siêu nguyên tố



Hãy viết chương trình đọc dữ liệu vào là một số nguyên N (0
kết quả các số siêu nguyên tố có N chữ số và số lượng của chúng.

Dữ liệu vào: Tệp văn bản SNT.INP chứa duy nhất số nguyên dương N

Kết quả: Ghi vào tệp SNT.OUT

- Dòng 1: Ghi các số siêu ngun tố có N chữ số

- Dòng tiếp theo ghi số lượng các số siêu nguyên tố.

SNT.INP



SNT.OUT



5



23333 23339 23399 23993 29399 31193 31379

37337 37339 37397 59393 59399 71933 73331

73939

Co 15 so sieu nguyen to



Số siêu nguyên tố:

Là số nguyên tố mà khi bỏ một số tùy ý các chữ số bên phải của nó thì

phần còn lại vẫn tạo thành một số ngun tố.

Ví dụ: 37337 là một số siêu nguyên tố có 5 chữ số vì 3733,373,37,3 cũng là các số

nguyên tố.

Ý tưởng của bài toán như sau:

- Xây dựng hàm số nguyên tố.

- Xây dưng hàm kiểm tra số i có phải là số siêu nguyên tố hay không.

Cụ thể ta xây dựng hàm kiểm tra siêu nguyên tố như sau:

Nếu nt(i):=false thì SNT:=False ;

Nếu nt(i)=true thì tiến hành giảm giá trị của i bằng cách chia nó cho 10 (i:= i div

10) và lại quay lại kiểm tra i cho đến khi i giảm xuống i=0 then snt:=true;

11



Chương trình con về kiểm tra một số nguyên bất kỳ có phải là số siêu nguyên tố

hay không? như sau:

function snt(i:longint):boolean;

begin

snt:=false;

repeat

if nt(i)=false then exit

else

i:= i div 10;

until i=0;

snt:=true;

end;

Ở chương trình con kiểm tra một số nguyên bất kỳ có phải là số siêu nguyên

tố. Ta đã sử dụng đến hàm kiểm tra một số ngun dương có phải là số ngun tố

thơng qua lời gọi nó. Như vậy với bài tốn về số siêu nguyên tố nếu ta xây dựng

được chương trình con kiểm tra một số nguyên bất kỳ là số nguyên tố hay khơng?

Thì dễ dàng xây dựng được chương trình con là số siêu nguyên tố.

- Xây dựng chương trình con thủ tục ghi vào tệp các số siêu nguyên tố đồng thời

ứng với mỗi số là siêu nguyên tố thì đếm .

- Ý tưởng ghi các số siêu nguyên tố vào tệp:

+ Trước hết tìm giá trị đầu và giá trị cuối của số có n chữ số

Gtd:=1; gtc:=1;

For i:=1 to n-1 do gtd:=gtd*10;

Gtc:=(gtd*10)-1;

+ Sau khi tìm được giá trị đầu và giá trị cuối thì tiến hành kiểm tra các số có n chữ

số trong khoảng từ GTD đến GTC. Nếu là số siêu nguyên tố thì ghi vào tệp và

đồng thời đếm.

Thể hiện qua đoạn lệnh sau:

For i:=gtd to gtc do

If snt(i) then begin write(f2, i,’ ‘); inc(dem); end;

Xây dựng cụ thể chương trình con ghi vào tệp các số siêu nguyên tố đồng thời ứng

với mỗi số là siêu nguyên tố thì đếm:

12



procedure xulytep;

var

gtd,gtc:longint;

dem:integer;

begin

gtd:=1; gtc:=1; dem:=0;

for i:=1 to n-1 do gtd:=gtd*10;

gtc:=gtd*10; dec(gtc);

for i:=gtd to gtc do

if snt(i) then

begin

write(f2,i,' '); inc(dem);

end;

writeln(f2); write(f2, 'co ',dem,'so sieu nguyen to');

end;

Chương trình cụ thể với bài tốn 2:

Const fi='nguyento.inp';

fo='nguyento.out';

Var n,m, i:longint;

f1,f2:text;

Procedure doctep;

begin

assign(f1,fi); reset(f1);

assign(f2,fo); rewrite(f2);

read(f1,n);S

end;

Function nt(n:longint):boolean;

var k,m,i:longint;

begin

13



if (n=2) or (n=3) then begin nt:=true; exit; end;

if( (n=1)or (n mod 2=0)or (n mod 3 =0) )then begin nt:=false; exit; end;

k:=-1;

m:=trunc(sqrt(n));

repeat

inc(k,6);

if (n mod k =0) or (n mod (k+2) = 0) then break;

until k>m;

if k>m then nt:=true

else nt:=false;

end;

Function snt(i:longint):boolean;

begin

snt:=false;

repeat

if nt(i)=false then exit

else

i:= i div 10;

until i=0;

snt:=true;

end;

Procedure xuly;

var

gtd,gtc:longint;

dem:integer;

begin

gtd:=1;

gtc:=1;

dem:=0;

for i:=1 to n-1 do gtd:=gtd*10;

gtc:=gtd*10;

14



dec(gtc);

for i:=gtd to gtc do

if snt(i) then

begin

write(f2,i,' ');

inc(dem);

end;

writeln(f2);

write(f2, 'co ',dem,'so sieu nguyen to');

end;

Procedure dongtep;

begin

close(f1);

close(f2);

end;

Begin

doctep; xuly; dongtep;

End.

Liên quan đến hàm ngun tố còn có các bài tốn về tính chất của một dãy số

Cụ thể bài toán sau:

Bài toán 3:



Dãy số đặc biệt



Dãy số A1,A2,...,An được gọi là dãy số đặc biệt nếu nó thỏa mãn các điều kiện sau

- Là dãy số giảm dần

- Với mỗi A thì A’ hoặc là số nguyên tố hoặc là ước của một trong các số từ

A1 đến Ai-1

Em hãy tìm dãy số đặc biệt dài nhất bắt đầu từ N.

Dữ liệu vào: Từ File văn bản DAYSO.INP là một số nguyên dương N

(N<10000)

Kết quả: Ghi ra File văn bản DAYSO.OUT là dãy số tìm được các số cách nhau

bởi dấu cách.

DAYSO.INP



DAYSO.OUT



12



12 11 7 6 5 4 3 2 1

15



Ý tưởng bài toán:

- Xây dựng hàm kiểm tra tính ngun tố

- Tìm các số thỏa mãn điều kiện là số nguyên tố hoặc là ước của N ghi vào tệp

procedure xuly;

begin

write(f2,n,' ');

for j:=n-1 downto 1 do

if (N mod j =0) or (nt(j)) then write(f2,j,' ');

end;

Như vậy với dạng bài toán này chúng ta nghĩ ngay đến hàm nguyên tố.

Chương trình cụ thể với bài tốn 3:

Const fi='DAYSO.INP';

fo='DAYSO.OUT';

Var f1,f2:text;

a:array[1..10000] of longint;

n,i,j:longint;

Procedure doctep;

begin

assign(f1,fi);



reset(f1);



while not eof(f1) do

read(f1,n);

assign(f2,fo); rewrite(f2);

end;

Function nt(n:int64):boolean;

var k,m,i:longint;

begin

if (n=2) or (n=3) then begin nt:=true; exit; end;

if( (n=1)or (n mod 2=0)or (n mod 3 =0) )then begin nt:=false; exit; end;

k:=-1;

16



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

2 Thực trạng của vấn đề

Tải bản đầy đủ ngay(0 tr)

×