Bai_tap_Pascal
Bai tap Pascal
CÁC THUT TOÁN V S
THUT TOÁN KIM TRA S NGUYÊN T
Thut toán ca ta da trên ý tưởng: nếu n >1 không chia hết cho s nguyên nào trong tt c
các s t 2 đến thì n là s nguyên t. Do đó ta s kim tra tt c các s nguyên t 2 đến
round(sqrt(n)), nếu n không chia hết cho s nào trong đó thì n là s nguyên t.
Nếu thy biu thc round(sqrt(n)) khó viết thì ta th kim tra t 2 đến n div 2.
m kim tra nguyên t nhn vào mt s nguyên n và tr li kết qu là true (đúng) nếu n là
nguyên t tr li false nếu n không s ngun t.
function ngto(n:integer):boolean;
var i:integer;
begin
ngto:=false;
if n<2 then exit;
for i:=2 to trunc(sqrt(n)) do
if n mod i=0 then exit; {nếu n chia hết cho i thì n không là nguyên t => thoát luôn}
ngto:=true;
end;
Chú ý: Da trên hàm kim tra ngun t, ta có th tìm các s ngun t t 1 đến n bngch
cho i chy t 1 đến n và gi hàm kim tra ngun t vi tng gtr i.
THUT TOÁN TÍNH TNG CÁC CH S CA MT S
NGUYÊN
Ý tưởng là ta chia s đó cho 10 ly dư (mod) thì được ch s hàng đơn v, và ly s đó div
10 thì s được phn còn li. Do đó s chia liên tc cho đến khi kng chia được na (s đó
bng 0), mi ln chia thì được mt ch s ta cng dn ch s đó vào tng.
m tính tng ch s nhno 1 s ngun n tr li kết qutng các ch s ca nó:
function tongcs(n:integer): integer;
var s : integer;
begin
s := 0;
while n <> 0 do begin
s := s + n mod 10;
n := n div 10;
end;
tongcs := s;
end;
Chú ý: nh tích c ch s cũng tương t, ch cn c ý ban đu n s 1 thc hin
phép nn s vi n mod 10.
THUT TOÁN EUCLIDE TÍNH UCLN
Ý tưởng ca thut toán Euclide UCLN ca 2 s a,b cũng UCLN ca 2 s ba mod b,
vy ta s đi a b, b là a mod b cho đến khi b bng 0. Khi đó UCLN là a.
m UCLN nhn vào 2 s nguyên a,b tr li kết qu UCLN ca 2 s đó.
function UCLN(a,b: integer): integer;
var r : integer;
begin
while b<>0 do begin
r := a mod b;
a := b;
b := r;
end;
UCLN := a;
end;
Chú ý: Da trên thut toán tính UCLN ta có th kim tra được 2 s ngun t cùng nhau hay
không. Ngoài ra cũng th ng đ ti gin phân s bng ch chia c t và mu cho UCLN.
THUT TOÁN TÍNH TNG CÁC ƯỚC S CA MT S
NGUYÊN
Đ tính tng các ước s ca s n, ta cho i chy t 1 đến n div 2, nếu n chia hết cho s nào
thì ta cng s đó vào tng. (Chú ýchnh này chưa xét n cũng ước s ca n).
function tongus(n : integer): integer;
var i,s : integer;
begin
s := 0;
for i := 1 to n div 2 do
if n mod i = 0 then s := s + i;
tongus := s;
end;
Chú ý: Da trên thut toán tính tng ước s, ta th kim tra được 1 s nguyên s
hoàn thin kng: s nguyên gi s hoàn thin nếu bng tng c ước s ca nó.
CÁC THUT TOÁN V VÒNG LP
THUT TOÁN TÍNH GIAI THA MT S NGUYÊN
Giai tha n! làchc s t 1 đến n. Vy m giai tha viết như sau:
function giaithua(n : integer) : longint;
var i : integer; s : longint;
begin
s := 1;
for i := 2 to n do s := s * i;
giaithua := s;
end;
THUT TOÁN TÍNH HÀM MŨ
Trong Pascal ta có th tính ab bng công thc exp(b*ln(a)). Tuy nhiên nếu a không phi là s
dương thì kng th áp dng được.
Ta th tính hàman bng công thc lp như sau:
function hammu(a : real; n : integer): real;
var s : real; i : integer;
begin
s := 1;
for i := 1 to n do s := s * a;
hammu := s;
end;
THUT TOÁN TÍNH CÔNG THC CHUI
Thut toán tínhm ex:
Đt: , ta được công thc truy hi:
Khi đó, ta có th tính công thc chui trên như sau:
function expn(x: real; n : integer): real;
var s,r : real; i : integer;
begin
s := 1; r := 1;
for i := 1 to n do begin
r := r * x / i;
s := s + r;
end;
expn := s;
end;
CÁC BÀI TP V MNG 1 CHIU VÀ 2 CHIU
BÀI TP 1
Nhp vào mt s n (5<=n<=10) n phn t ca dãy a, 1<ai<100 (có kim tra d liu khi
nhp).
a) In rac phn t s nguyên t cay.
b) Tính ước chung ln nht ca tt cc phn t ca dãy.
c) Tính biu thc sau:
d) Sp xếp y tăng dn và in ra dãy sau sp xếp.
HƯỚNG DN
Ta nên chia chương trình thành các chương trình con, mi chương trình thc hin mt yêu
cu. Ngi ra ta cũng viết thêm các hàm kim tra nguyên t, hàm mũ, hàm UCLN đ thc hin
các yêu cu đó.
Chương trình như sau:
Khai báo d liu:
uses crt;
var n : integer;
a : array[1..10] of integer; {n<=10 nên mng có ti đa 10 phn t}
Th tc nhp d liu, có kim tra khi nhp.
procedure nhap;
var i : integer;
begin
clrscr;
write('NHAP VAO SO PHAN TU N = ');
repeat
readln(n);