Sáng kiến kinh nghiệm Lập trình Pascal giải một số bài toán Toán học THPT làm tài liệu ôn thi học sinh giỏi môn Tin học ở trường THPT 19-5

ĐẶT VẤN ĐỀ

Theo thời gian, sự phát triển khoa học kỹ thuật ngày càng đạt được những thành tựu to lớn; những kiến thức khoa học ngày càng sâu và rộng hơn. Khoa học kỹ thuật đã có những tác động quan trọng góp phần làm thay đổi bộ mặt của xã hội loài người, nhất là những ngành khoa học kỹ thuật cao. Cũng như các môn khoa học khác, Tin học là bộ môn được hình thành và phát triển thành một ngành khoa học với các nội dung, mục tiêu, phương pháp nghiên cứu riêng và ngày càng có nhiều ứng dụng trong hầu hết các lĩnh vực hoạt động của xã hội loài người.

 

doc30 trang | Chia sẻ: binhthang88 | Lượt xem: 4665 | Lượt tải: 3Download
Bạn đang xem 20 trang mẫu của tài liệu "Sáng kiến kinh nghiệm Lập trình Pascal giải một số bài toán Toán học THPT làm tài liệu ôn thi học sinh giỏi môn Tin học ở trường THPT 19-5", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
để truy cập tới phần tử thứ i ta viết: A[i].
2.1.4 Xâu kí tự
* Khai báo kiểu xâu kí tự
Xâu (string) là kiểu dữ liệu có cấu trúc dùng để xử lí các xâu kí tự. 
Kiểu xâu và kiểu mảng có nhiều điểm tương tự nhưng cũng có điểm khác nhau là: số kí tự trong một biến kiểu xâu có thể thay đổi còn số phần tử của mảng luôn cố định.
- Khai báo:
Var Tên_biến: string[n];
Trong đó: n là số kí tự cực đại có thể của xâu. Chiều dài tối đa của một xâu là 255.
Nếu trong khai báo không ghi [n] thì xâu có độ dài ngầm định là 255.
* Các thủ tục và hàm trên xâu kí tự
+ Delete(S,m,n): thủ tục này sẽ xóa khỏi xâu S n kí tự bắt đầu từ vị trí thứ m (tính từ trái sang phải).
+ Insert(S2, S1, m): thủ tục chèn xâu S2 vào S1 ở vị trí thứ m.
+ STR(n, S): thủ tục đổi giá trị số n thành xâu rồi gán cho S.
+ Val(S, n, code): thủ tục đổi xâu chữ số S (S biểu diễn một số nguyên hay số thực nào đó) thành một số và gán cho biến n. Code là số nguyên để phát hiện lỗi: nếu phép biến đổi đúng thì code có giá trị là 0, nếu sai là do S không biểu diễn đúng số nguyên hay số thực, code sẽ nhận giá trị bằng vị trí của kí tự sai trong xâu.
+ Length(S): hàm cho độ dài của biểu thức xâu kí tự S.
+ Copy(S,m,n): hàm cho một xâu mới bằng cách chép n kí tự từ xâu S bắt đầu từ vị trí m.
+ Concat(S1, S2,, Sn): hàm này sẽ ghép nối tất cả các xâu kí tự S1, S2, , Sn thành một xâu theo thứ tự đã viết.
+ Pos(S1, S2): hàm cho vị trí đầu tiên xuất hiện xâu S1 trong xâu S2. Nếu không tìm thấy, hàm có giá trị là 0. 
2.2. Lập trình một số bài tập Toán học THPT
Bài 1. Giải phương trình: ax + b = 0 (1)
* Ý tưởng: thông thường các em có thể bị mắc lỗi là biến đổi (1)
 ax=-b x= -ba . Như vậy thì trong trường hợp a = 0 thì sẽ bị lỗi. Vì đề bài không cho a≠0 cho nên phải xét các trường hợp sau:
- Nếu a≠0 thì phương trình có nghiệm x=-ba
- Nếu a = 0 thì phải xét đến b:
+ Nếu b = 0 thì (1) trở thành 0x + 0 = 0 (luôn đúng) do đó (1) có vô số nghiệm
+ Ngược lại nếu b≠0 thì (1) vô nghiệm.
* Chương trình:
var a,b: integer;
x: real;
begin
 clrscr;
 write('Nhap a,b: ');
 readln(a,b);
 if a0 then
 begin
 x:=-b/a;
 writeln('x = ',x:8:2);
 end
 else
 if b=0 then writeln('Phuong trinh co vo so nghiem')
 else writeln('Phuong trinh vo nghiem');
 readln;
end.
Bài 2. Giải phương trình bậc hai: ax2 + bx + c = 0 (a ≠ 0)
Với cách giải quen thuộc đã biết, ta sẽ chuyển thành viết chương trình như sau:
* Chương trình:
var d,x1,x2: real;
a,b,c: integer;
begin
 write('Nhap a,b,c: ');
 readln(a,b,c);
 d:=b*b-4*a*c;
 if d>=0 then
 begin
 x1:=(-b+sqrt(d))/(2*a);
 x2:=(-b-sqrt(d))/(2*a);
 write('x1 = ',x1:8:2,'; x2= ',x2:8:2);
 end
 else writeln('Phuong trinh vo nghiem');
end.
Bài 3. Tìm UCLN (Ước chung lớn nhất) và BCNN (Bội chung nhỏ nhất) của hai số nguyên dương M và N.
* Ý tưởng: Khi M và N còn khác nhau thì số nào lớn hơn sẽ lấy số lớn trừ số bé cho đến khi chúng bằng nhau thì dừng. Khi đó UCLN sẽ là một trong hai số M hoặc N (vì lúc này chúng bằng nhau).
* Chương trình:
var m,n,uc: longint;
function ucln(a,b: longint): longint;
var du: longint;
begin
 while ab do
 if a>b then a:=a-b else b:=b-a;
 ucln:=a;
end;
begin
 write('Nhap m,n: ');
 readln(m,n);
 uc:=ucln(m,n);
 writeln('Uoc chung lon nhat: ',uc);
 writeln('Boi chung nho nhat: ',m*n div uc);
end.
è Vận dụng hàm tìm UCLN ở trên có thể áp dụng giải bài Tổng phân số dưới đây:
Bài 4. Tổng phân số
Cho hai phân số ab và cd, trong đó a, b, c, d là những số nguyên dương. Hãy tìm phân số tối giản của tổng ab+cd .
Input
Dòng 1 chứa a và b
Dòng 2 chứa c và d
Output:
Chứa phân số dạng tu/mau, là phân số tối giản của tổng ab+cd .
Ví dụ
Input
Output
1 2
3 4
5/4
* Ý tưởng: Bằng cách quy đồng thông thường: 
Ta sẽ có: t := a*d+b*c; m := b*d;
Sau đó chia cả t và m cho ước chung lớn nhất của t và m thì sẽ được phân số tổng cuối cùng đồng thời cũng là phân số tối giản.
* Chương trình:
var a,b,c,d,t,m,k:longint;
 f:text;
function ucln(x,y: longint): longint;
var du: longint;
begin
 while xy do
 if x>y then x:=x-y else y:=y-x;
 ucln:=x;
end;
BEGIN
 readln(a,b);
 readln(c,d);
 t := a*d+b*c;
 m := b*d;
 k := ucln(t,m);
 t := t div k;
 m := m div k;
 write(t,'/',m);
END.
Bài 5. Giải hệ bậc nhất hai ẩn:
Hệ phương trình bậc nhất hai ẩn có dạng: 
* Ý tưởng: Có thể giải hệ bằng phương pháp Crame như sau: 
Lần lượt tính: 
(Để dễ nhớ có thể thuộc câu: "Anh bạn, cầm bát, ăn cơm" để lần lượt tính D, Dx, Dy)
* TH1: khi D ≠ 0 thì hệ có nghiệm duy nhất:
* TH2: Khi D = 0 thì xét:
- TH2.1: Khi Dx= Dy = 0 thì hệ có vô số nghiệm
- TH2.2: Khi thì hệ vô nghiệm
* Chương trình:
(Trong chương trình tương ứng: a: a1, b: b1, c: c1, a': a2, b': b2, c': c2)
var x,y,D,Dx,Dy,a1,a2,b1,b2,c1,c2: real;
begin
 write('Nhap a1,b1,c1,a2,b2,c2: ');
 readln(a1,b1,c1,a2,b2,c2);
 D := a1*b2 - a2*b1;
 Dx := c1*b2 - c2*b1;
 Dy := a1*c2 - a2*c1;
 if D0 then
 begin
 x:=Dx/D;
 y:=Dy/D;
 writeln('He co nghiem duy nhat');
 writeln('x = ',x:8:2, ' y= ',y:8:2);
 end
 else if (Dx=0) and (Dy=0) then writeln('He co vo so nghiem')
 else writeln('He vo nghiem');
 readln;
end.
Sau khi làm xong bài trên có thể áp dụng để giải bài xét vị trí tương đối của hai đường thẳng (Đề thi năm 2005 - 2006). Khi đó nếu hệ có 1 nghiệm duy nhất thì hai đường thẳng cắt nhau, hệ có vô số nghiệm thì hai đường thẳng trùng nhau, còn hệ vô nghiệm thì hai đường thẳng song song (trước đó lưu ý phải chuyển c1, c2 sang bên phải và đổi dấu). Đề cho như dưới đây các em tự làm:
Bài 6. Vị trí tương đối của hai đường thẳng (Đề thi năm 2005 - 2006)
Trên mặt phẳng cho hai đường thẳng d1 và d2, biết rằng phương trình tổng quát của đường thẳng:
d1 là: a1.x + b1.y + c1 = 0
d2 là: a2.x + b2.y + c2 = 0
Lập chương trình nhập từ bàn phím các số thực: a1, b1, c1, a2, c2, d2 và cho biết:
- Vị trí tương đối giữa d1 với d2 trên mặt phẳng: cắt nhau, song song hay trùng nhau.
- Nếu cắt nhau thì cho biết tọa độ giao điểm (tính chính xác tới 4 chữ số thập phân).
VD: a1=2, b1=5, c1 = 9; a2 = 1, b2 = 5, c2 = 7 thì d1 cắt d2 tại điểm (2,000: 1,000)
Bài 7. Xét vị trí tương đối của hai đoạn thẳng (Đề thi năm 2006 - 2007)
Trong hệ trục tọa độ Đêcác Oxy, cho hai đoạn thẳng AB và CD có tọa độ các điểm là A(xA, yA), B(xB, yB), C(xC, yC), D(xD, yD), các tọa độ là các số nguyên có trị tuyệt đối nhỏ hơn 20000 và không điểm nào trùng lên nhau. Xét xem hai đoạn thẳng AB và CD có điểm chung với nhau hay không? Nếu có điểm chung thì in ra màn hình “Co diem chung” còn ngược lại in ra màn hình “Khong co diem chung”.
C
B
D
D
D
D
C
C
C
B
B
B
A
A
A
A
D
C
B
A
Các trường hợp AB và CD không có điểm chung
Các trường hợp AB và CD có điểm chung
* Ý tưởng: Đường thẳng (∆) đi qua A và B sẽ nhận vec tơ (xB-xA; yB-yA) làm vec tơ chỉ phương, suy ra vec tơ pháp tuyến của nó là (yA-yB; xB-xA) (vì . = 0). Vậy phương trình đường thẳng của ∆là: 
(yA-yB)(x-xA) + (xB-xA)(y-yA) = 0 
 (yA-yB)x + (xB-xA)y = (yA-yB)xA + yA(xB-xA)
(yA-yB)x + (xB-xA)y = xB.yA - xA.yB
Tương tự đường thẳng (∆') đi qua hai điểm C và D sẽ có phương trình là:
(yC-yD)x + (xD-xC)y = xD.yC - xC.yD
è Giải hệ: 
- Nếu hệ (I) vô nghiệm tức là ∆ và (∆') song song với nhau do đó AB và CD không có điểm chung.
- Nếu hệ (I) có 1 nghiệm tức là ∆ và ∆' cắt nhau tại 1 điểm, khi đó gọi G là giao điểm của ∆ và ∆', nếu G nằm giữa A và B, đồng thời G nằm giữa C và D thì đoạn AB và CD có điểm chung. Có thể kiểm tra 1 điểm nằm giữa hai điểm bằng cách: tính khoảng cách GA, GB, AB, nếu G nằm trên AB thì GA+GB = AB, tuy nhiên trong quá trình máy tính toán có thể lấy tròn số nên nhiều khi GA+GB≠AB, do đó nếu chỉ cần (ở đây eps là một số rất bé eps = 0.0001) thì có thể coi G nằm trên AB.
- Nếu hệ (I) có vô số nghiệm tức là ∆ và ∆' trùng nhau khi đó nếu (C nằm giữa A và B) hoặc (D nằm giữa A và B) hoặc (A nằm giữa C và D) hoặc (B nằm giữa C và D) thì hai đoạn AB và CD có điểm chung.
* Chương trình minh họa
const eps=0.0001;
var xa,ya,xb,yb,xc,yc,xd,yd,xg,yg: real;
a1,b1,c1,a2,b2,c2,d,dx,dy: real;
function kc(x,y,z,k: real): real;
begin
 kc:=sqrt(sqr(z-x)+sqr(k-y));
end;
function namgiua(m,n,p,q,h,g:real): boolean;
begin
 namgiua:=abs(kc(m,n,h,g)+kc(p,q,h,g)-kc(m,n,p,q))<eps;
end;
begin
 write('Nhap toa do A va B: ');
 readln(xa,ya,xb,yb);
 write('Nhap toa do C va D: ');
 readln(xc,yc,xd,yd);
 a1:=ya-yb; b1:=xb-xa; c1:=xb*ya-xa*yb;
 a2:=yc-yd; b2:=xd-xc; c2:=xd*yc-xc*yd;
 D:=a1*b2-a2*b1;
 Dx:=c1*b2-c2*b1;
 Dy:=a1*c2-a2*c1;
 if D0 then
 begin
 xg:=Dx/D;
 yg:=Dy/D;
 if namgiua(xa,ya,xb,yb,xg,yg) and namgiua(xc,yc,xd,yd,xg,yg) then
 writeln('Co diem chung')
 else writeln('Khong co diem chung');
 end
 else if (D=0) and (Dx=0) and (Dy=0)then
 begin
 if namgiua(xa,ya,xb,yb,xc,yc) or namgiua(xa,ya,xb,yb,xd,yd)
 or namgiua(xc,yc,xd,yd,xa,ya) or namgiua(xc,yc,xd,yd,xb,yb) then
 writeln('Co diem chung') else writeln('Khong co diem chung');
 end
 else writeln('Khong co diem chung');
 readln;
end.
Bài 8. Vị trí tương đối của hai đường tròn (Đề thi năm 2009 - 2010)
Cho đường tròn O1 có tọa độ tâm (x1, y1) bán kính R1, đường tròn O2 có tọa độ tâm (x2, y2) bán kính R2 (Tọa độ tâm là các số nguyên 2 byte; R1, R2 là các số nguyên dương 2 byte). Viết chương trình xét xem vị trí tương đối giữa hai đường tròn thuộc vào trường hợp nào sau đây:
1. Hai đường tròn cắt nhau tại 2 điểm phân biệt:
2. Hai đường tròn đựng nhau không tiếp xúc:
3. Hai đường tròn đựng nhau và tiếp xúc trong:
4. Hai đường tròn tiếp xúc ngoài:
5. Hai đường tròn không có điểm chung nào (rời nhau):
6. Hai đường tròn trùng khít lên nhau:
Dữ liệu vào cho trong tệp văn bản BAI2.INP hoặc nhập từ bàn phím dòng đầu là 3 số x1, y1, R1; dòng thứ hai là 3 số x2, y2, R2.
Kết quả ghi ra tệp văn bản BAI2.OUT hoặc in ra màn hình câu thông báo về vị trí tương đối giữa hai đường tròn ứng với các trường hợp đã nêu ở trên.
Ví dụ:
BAI2.INP
BAI2.OUT
0 0 4
0 5 3
Hai duong tron cat nhau tai hai diem phan biet
* Ý tưởng: Khi có tọa độ 2 tâm đường tròn thì ta sẽ tính khoảng cách của nó. Khi đó nhận thấy:
- Nếu hai đường tròn cắt nhau thì : |R1 – R2| < O1O2 < R1 + R2
- Nếu hai đường tròn tiếp xúc nhau thì :
Hai đường tròn tiếp xúc trong : O1O2 = |R1 – R2| và (x1 ≠ x2 hoặc y1 ≠ y2)
Hai đường tròn tiếp xúc ngoài : O1O2 = R1 + R2
- Nếu hai đường tròn không giao nhau thì :
hai đường tròn ngoài nhau : O1O2 > R1 + R2
hai đường tròn đựng nhau : O1O2 < |R1 – R2|
- Nếu hai đường tròn hai đường tròn đồng tâm (trùng khít lên nhau): 
O1O2 = 0
* Chương trình:
var x1,y1,x2,y2,r1,r2: integer;
o1o2: real;
begin
 readln(x1,y1,r1);
 readln(x2,y2,r2);
 o1o2:=sqrt(sqr(x2-x1)+sqr(y2-y1));
 if (abs(r1-r2)<o1o2) and (o1o2<r1+r2) then
 writeln('Hai duong tron cat nhau');
 if (o1o2=abs(r1-r2)) and ((x1x2) or (y1y2))
 then writeln('Hai duong tron tiep xuc trong');
 if o1o2=r1+r2 then writeln('Hai duong tron tiep xuc ngoai');
 if o1o2>r1+r2 then writeln('Hai duong tron ngoai nhau');
 if o1o2<abs(r1-r2) then writeln('Hai duong tron dung nhau');
 if o1o2=0 then writeln('Hai duong tron trung nhau');
end.
Bài 9. Diện tích (Đề thi năm 2016 – 2017)
Một mảnh vườn hình thang cân có độ dài đáy nhỏ, đáy lớn và cạnh bên lần lượt là a, b và c.a
b
c
 Ở giữa vườn người ta đào một cái giếng để lấy nước tưới có độ dài bán kính bằng 1/4 độ dài của đường cao hình thang.
Hỏi: Diện tích còn lại để trồng rau là bao nhiêu. Biết giá trị pi = 3.14. Kết quả lấy 2 chữ số sau dấu phẩy.
INPUT
Chứa 3 số thực a, b, c lần lượt là đáy nhỏ, đáy lớn và cạnh bên của hình thang.
OUTPUT
Một số nguyên là diện tích cần tìm. Kết quả lấy 2 chữ số sau dấu phẩy.
Ví dụ:
INPUT
OUTPUT
5 9 4
21.89
Y
a
b
c
* Ý tưởng: - Đầu tiên phải tính được đường cao h của hình thang cân, sau đó sẽ tìm được bán kính của hình tròn. 
X
Z
d
h
Từ đó tính diện tích hình thang cân, hình tròn => diện tích cần phải tính.
- Kẻ đường cao h của hình thang cân, khi đó tam giác XYZ là tam giác vuông, Đặt d = XZ, ta sẽ có b = a + d + d è d = (b-a)/2
Vậy c2 = d2 +h2 è h = c2-d2 
* Chương trình:
var a,b,c,h,scl: real;
begin
 readln(a,b,c);
 h:=sqrt(c*c - sqr(b-a)/4);
 scl:=(a+b)*h/2 - 3.14*sqr(h/4);
 writeln(scl:0:2);
end.
Bài 10. Nhận xét tam giác (Đề thi năm 2007 - 2008)
Trong mặt phẳng cho 3 điểm: A(x1; y1), B(x2; y2), C(x3; y3) phân biệt. Viết chương trình kiểm tra xem 3 điểm A, B, C có là ba đỉnh của một tam giác hay không. Nếu A, B, C là ba đỉnh một tam giác thì đưa ra tọa độ trọng tâm G của tam giác ABC.
* Ý tưởng: tính độ dài đoạn AB, BC, AC thông qua công thức tính khoảng cách: Với hai điểm A(x1; y1), B(x2, y2) thì độ dài đoạn 
Sau khi có AB, BC, AC thì 3 đoạn này tạo thành tam giác khi tổng hai cạnh bất kì phải lớn hơn cạnh còn lại. Nếu thỏa mãn là tam giác thì tính tọa độ trọng tâm G bằng công thức .
* Chương trình:
uses crt;
var x1,y1,x2,y2,x3,y3,a,b,c,xG,yG: real;
begin
 clrscr;
 write('Nhap x1, y1, x2, y2, x3, y3: ');
 readln(x1,y1,x2,y2,x3,y3);
 a:=sqrt(sqr(x3-x2)+sqr(y3-y2));
 b:=sqrt(sqr(x3-x1)+sqr(y3-y1));
 c:=sqrt(sqr(x2-x1)+sqr(y2-y1));
 if (a+b>c) and (b+c>a) and (c+a>b) then
 begin
 writeln('Day la tam giac');
 xG:=(x1+x2+x3)/3; yG:=(y1+y2+y3)/3;
 writeln('Toa do trong tam G la: ');
 writeln('xG = ',xG:8:2, '; yG = ',yG:8:2);
 end
 else writeln('Day khong phai tam giac');
 readln;
end.
Bài 11. Góc Tam giác (Đề thi năm 2015-2016)
Cho 3 số nguyên dương A, B, C (1 ≤ A, B, C ≤ 180). Hãy viết chương trình kiểm tra xem A, B, C có là số đo ba góc trong của một tam giác hay không? Nếu có thì đó là tam giác đều, vuông-cân, vuông, cân hay tam giác thường?
Dữ liệu: Gồm một dòng chứa ba số nguyên dương A, B, C. Các số cách nhau một dấu cách.
Kết quả: 
Nếu A, B, C không phải số đo ba góc trong của tam giác thì in ra thông báo 'NO'.
Ngược lại thì in ra một trong các thông báo sau: 'DEU', 'VUONG-CAN', 'VUONG', 'CAN', 'THUONG' lần lượt tương ứng với các trường hợp: tam giác đều, tam giác vuông cân, tam giác vuông, tam giác cân, tam giác thường.
Ví dụ:
Ví dụ 1
Ví dụ 2
Input
Output
Input
Output
45 55 90
NO
45 90 45
VUONG-CAN
* Ý tưởng: từ kiến thức đã biết về tam giác: thường, đều, vuông, vuông-cân, cânđể viết và sắp xếp các câu lệnh sao cho phù hợp.
* Chương trình:
program tamgiac;
var a, b, c: integer; 
function max(x,y: integer): integer;
begin
 if x>y then max:=x else max:=y;
end;
begin
 read(a, b, c);
	if (a + b + c 180) then write('NO')
	else
	if (a = b)and(b = c) then write('DEU')
	else begin
	if max(a, max(b, c)) = 90 then begin
	write('VUONG');
	if (a = b)or(b=c)or(a=c) then write('-CAN');
	end
	else
	if (a = b)or(b=c)or(a=c) then write('CAN')
	else write('THUONG');
	end;	
end.
Bài 12. Cạnh của tam giác vuông (Đề thi năm 2005 - 2006) 
Em đã biết trong tam giác vuông cạnh huyền a, hai cạnh góc vuông b, c thì:
 a2 = b2 + c2
Cho biết giá trị nguyên dương n nhập vào từ bàn phím. Em hãy tìm và in lần lượt ra màn hình tất cả bộ 3 số nguyên dương a, b, c khác nhau nhỏ hơn n thỏa mãn là các cạnh của một tam giác vuông.
Ví dụ:
n = 10, ta tìm được 1 bộ: 3, 4, 5 (vì 52 = 42 + 32)
Lưu ý: nếu a, b, c là một bộ thì a, c, b không được tính nữa. Ví dụ: (3, 4, 5) là 1 bộ thì (4, 3, 5) không được tính là một bộ khác nữa.
* Ý tưởng: dùng 3 vòng For lồng nhau như ở phần chương trình dưới đây:
* Chương trình:
var n,a,b,c: longint;
begin
 readln(n);
 for a:=1 to n-1 do
 for b:=a+1 to n-1 do
 for c:=b+1 to n-1 do
 if c*c=a*a+b*b then writeln(a,' ',b,' ',c);
end.
Bài 13. Dãy số Fibonaci (Đề thi năm 2007 - 2008)
Dãy số Fibonaci được định nghĩa như sau:
 F(n)=
 1 n ≤ 2
 F(n-2) + F(n-1) n>2
Hãy lập chương trình in ra số Fibonaci thứ n (0< n ≤ 100)
Dữ liệu vào: Nhập vào từ bàn phím số n
Kết quả ra: in ra màn hình số F(n) (số Fibonaci thứ n)
Ví dụ: n = 20 ta có F(n) = 6765
* Ý tưởng: 
- Khi 0 < n ≤ 2 thì Fi:=1;
- Khi n > 2 thì: gán a:=1; b:=1;
 Sau đó cho i chạy từ 3 đến n và ta gán như sau: 
Begin
 fi:= a+b;
 A:=b;
 B:=fi;
End;
è Cuối cùng sẽ nhận được Fi. Tuy nhiên bài giải này n chỉ cho phép trong phạm vi (0 < n ≤ 92).
* Chương trình minh họa:
var fi,a,b: int64;
i,n: longint;
begin
 write('Nhap n: ');
 readln(n);
 if n<=2 then fi:=1
 else
 begin
 a:=1; b:=1;
 for i:=3 to n do
 begin
 fi:=a+b;
 a:=b;
 b:=fi;
 end;
 end;
 writeln(fi);
end.
Bài 14. Kiểm tra 1 số nguyên dương n nhập vào có phải là số nguyên tố hay không?
* Ý tưởng: Số nguyên dương n là số nguyên tố khi nó chỉ có đúng 2 ước là 1 và chính nó. 
Phương pháp đơn giản nhất để kiểm tra một số {\displaystyle n}n có là số nguyên tố không là kiểm tra xem nó có chia hết cho các số {\displaystyle m}m nằm trong khoảng 2 đến {\displaystyle n-1}n-1 hay không. Nếu {\displaystyle n}n chia hết cho một số {\displaystyle m}m nào đó thì {\displaystyle n}n là hợp số (Hợp số là một số tự nhiên có thể biểu diễn thành tích của hai số tự nhiên khác nhỏ hơn nó), ngược lại {\displaystyle n}n là số nguyên tố.
Thực ra việc kiểm tra với {\displaystyle m}m từ 2 đến {\displaystyle n-1}n-1 là không cần thiết, mà chỉ cần kiểm tra đến {\displaystyle {\sqrt {n}}}n. Đó là vì nếu {\displaystyle n}n là hợp số thì nó chắc chắn có một ước số không vượt quá {\displaystyle {\sqrt {n}}}.
* Chương trình:
uses crt;
var n: longint;
function ktnt(x: longint): boolean;
var i: longint;
begin
 ktnt:=false;
 if x<=1 then begin ktnt:=false; exit; end
 else if (x>=2) and (x<4) then begin ktnt:=true; exit; end
 else
 begin
 for i:=2 to trunc(sqrt(x)) do
 if x mod i=0 then begin ktnt:=false; exit; end;
 end;
 ktnt:=true;
end;
begin
 clrscr;
 write('Nhap n: ');
 readln(n);
 if ktnt(n) then writeln('Day la so nguyen to')
 else writeln('Day khong la so nguyen to');
 readln;
end.
è Vận dụng bài kiểm tra số nguyên tố ở trên có thể áp dụng giải nhiều bài khác: liệt kê các số nguyên tố trong phạm vi M, N (M, N nguyên dương); số nguyên tố đối xứng; các ước chung nguyên tố
Bài 15. Tổng và hiệu hai số nguyên (Đề thi năm 2005 - 2006)
Em hãy lập trình nhập vào từ bàn phím 2 số nguyên dương a và b (a ≥ b) và in ra màn hình giá trị a + b. Biết rằng a và b có không quá 100 chữ số.
* Ý tưởng: đầu tiên các em sẽ nghĩ đến việc khai báo hai biến a và b kiểu nguyên rồi tính tổng của chúng. Tuy nhiên đọc kĩ đề bài thì thấy rằng a và b giới hạn đến 100 chữ số, như vậy nếu đầu vào là 100 chữ số thì các kiểu dữ liệu số nguyên tính tổng a và b sẽ bị tràn số do đó sẽ cho kết quả sai. Do đó chúng ta thay vì dùng kiểu dữ liệu số nguyên thông thường thì sẽ dùng kiểu biến xâu để xử lí và cộng hai số theo cách chúng ta vẫn hay thường làm trên giấy.
* Chương trình minh họa:
uses crt;
var a,b,kq,c,s: string;
nho,t,m,n,code,i: integer;
begin
 clrscr;
 readln(a);
 readln(b);
 //lam cho do dai hai so bang nhau
 while length(a)<length(b) do a:='0'+a;
 while length(b)<length(a) do b:='0'+b;
 nho:=0; kq:='';
 //thuc hien cong tu phai sang trai
 for i:=length(a) downto 1 do
 begin
 //chuyen a[i],b[i] sang so
 val(a[i],m,code);
 val(b[i],n,code);
 t:=m+n+nho;
 nho:= t div 10;
 t:=t mod 10;
 //chuyen tu so sang xau de cong don vao kq
 str(t,s);
 kq:=s+kq;
 end;
 if nho>0 then kq:='1'+kq;
 writeln(kq);
 readln;
end.
3. Hiệu quả của giải pháp khoa học
Trong quá trình thực hiện sáng kiến đã tiến hành tập huấn, bồi dưỡng, trao đổi với các giáo viên và học sinh ôn luyện đội tuyển Tin học và cũng đã thu được một số kết quả như sau:
* Kết quả thi Học sinh giỏi môn Tin học: nhờ đã sử dụng các bài tập trên để ôn luyện cho các em mới vào đội tuyển nên:
+ Năm học 2015-2016 đội tuyển Tin có 2 em thì cả 2 em đều đạt giải, trong đó 01 giải 3 và 01 giải khuyến khích, đặc biệt có 1 em lớp 11 mới chỉ vào đội tuyển ôn được 4 tháng từ tháng 9 - 12 nhưng em đã tiếp thu rất nhanh và đạt giải 3, kiến thức ban đầu cũng từ những bài tập này để em làm quen.
+ Năm học 2016 - 2017: Đạt 01 giải Nhất
* Kết quả học tập môn Tin học của các em học sinh đội tuyển đã được nâng lên rõ rệt, ngoài ra cũng khích lệ cổ vũ nhiều em học khá môn Toán vào đội tuyển Tin.

File đính kèm:

  • docSang kiến-Bi Trường Giang.doc
Sáng Kiến Liên Quan