Một số thuật toán đơn giản


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 có 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 có th kim tra t 2 đến n div 2.
Hà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 và tr li false nếu n không là s nguyên t.
func­tion ng­to(n:in­te­ger):boolean;
var i:in­te­ger;
be­gin
    ng­to:=false;
    if n<2 then ex­it;
    for i:=2 to trunc(sqrt(n)) do
        if n mod i=0 then ex­it; {nếu n chia hết cho i thì n không là nguyên t => thoát luôn}
    ng­to:=true;
end;
Chú ý: Da trên hàm kim tra nguyên t, ta có th tìm các s nguyên t t 1 đến n bng cách cho i chy t 1 đến n và gi hàm kim tra nguyên t vi tng giá tr 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 không chia được na (s đó bng 0), mi ln chia thì được mt ch s và ta cng dn ch s đó vào tng.
Hàm tính tng ch s nhn vào 1 s nguyên n và tr li kết qu là tng các ch s ca nó:
func­tion tongcs(n:in­te­ger): in­te­ger;
var s : in­te­ger;
be­gin
            s := 0;
            while n <> 0 do be­gin
                        s := s + n mod 10;
                        n := n div 10;
            end;
            tongcs := s;
end;
Chú ý: Tính tích các ch s cũng tương t, ch cn chú ý ban đầu gán s là 1 và thc hin phép nhân s vi n mod 10.
THUT TOÁN EUCLIDE TÍNH UCLN
Ý tưởng ca thut toán Eu­clide là UCLN ca 2 s a,b cũng là UCLN ca 2 s b và a mod b, vy ta s đổi a là b, b là a mod b cho đến khi b bng 0. Khi đó UCLN là a.
Hàm UCLN nhn vào 2 s nguyên a,b và tr li kết qu là UCLN ca 2 s đó.
func­tion UCLN(a,b: in­te­ger): in­te­ger;
var r : in­te­ger;
be­gin
            while b<>0 do be­gin
                        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 nguyên t cùng nhau hay không. Ngoài ra cũng có th dùng để ti gin phân s bng cá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ú ý cách tính này chưa xét n cũng là ước s ca n).
func­tion tongus(n : in­te­ger): in­te­ger;
var i,s : in­te­ger;
be­gin
            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 có th kim tra được 1 s nguyên có là s hoàn thin không: s nguyên gi là s hoàn thin nếu nó bng tng cá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
Gi­ai tha n! là tích các s t 1 đến n. Vy hàm gi­ai tha viết như sau:
func­tion gi­aithua(n : in­te­ger) : longint;
var i : in­te­ger; s : longint;
be­gin
            s := 1;
            for i := 2 to n do s := s * i;
            gi­aithua := s;
end;
THUT TOÁN TÍNH HÀM MŨ
Trong Pas­cal 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ì không th áp dng được.
Ta có th tính hàm mũ an bng công thc lp như sau:
func­tion ham­mu(a : re­al; n : in­te­ger): re­al;
var s : re­al; i : in­te­ger;
be­gin
            s := 1;
            for i := 1 to n do s := s * a;
            ham­mu := s;
end;
THUT TOÁN TÍNH CÔNG THC CHUI
Thut toán tính hàm ex:

Đặt:  và , ta được công thc truy hi:
Khi đó, ta có th tính công thc chui trên như sau:
func­tion ex­pn(x: re­al; n : in­te­ger): re­al;
var s,r : re­al; i : in­te­ger;
be­gin
            s := 1; r := 1;
            for i := 1 to n do be­gin
                        r := r * x / i;
                        s := s + r;
            end;
            ex­pn := 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) và n phn t ca dãy a, 1<ai<100 (có kim tra d liu khi nhp).
a)      In ra các phn t là s nguyên t ca dãy.
b)      Tính ước chung ln nht ca tt c các phn t ca dãy.
c)       Tính biu thc sau:
d)      Sp xếp dã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. Ngoài 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:
us­es crt;
var n : in­te­ger;
      a : ar­ray[1..10] of in­te­ger; {n<=10 nên mng có ti đa 10 phn t}
Th tc nhp d liu, có kim tra khi nhp.
pro­ce­dure nhap;
var i : in­te­ger;
be­gin
            clrscr;
            write('NHAP VAO SO PHAN TU N = ');
            re­peat
                        readln(n);
                        if (5<=n) and (n<=10) then break; {nếu thoã mãn thì dng vòng lp}
                        writeln('Khong hop le (5<=n<=10). Nhap lai!!!'); {ngược li thì báo li}
            un­til false;
            writeln('NHAP VAO N PHAN TU (1<ai<100)');
            for i := 1 to n do be­gin
                        write('a',i,'=');
                        re­peat
                                    readln(a[i]);
                                    if (1<a[i]) and (a[i]<100) then break;
                                    writeln('Khong hop le. Nhap lai!!!');
                        un­til false;
            end;
end;
func­tion ng­to(n : in­te­ger): boolean; {hàm kim tra nguyên t, xem gii thích phn trên}
var i : in­te­ger;
be­gin
            ng­to := false;
            if n < 2 then ex­it;
            for i := 2 to round(sqrt(n)) do
                        if n mod i = 0 then ex­it;
            ng­to := true;
end;
Th tc in các s nguyên t ca mt mng
pro­ce­dure in­ng­to;
var i :in­te­ger;
be­gin
            writeln('CAC PHAN TU NGUYEN TO TRONG DAY:');
            for i := 1 to n do                                     {duyt qua mi phn t t 1 đến n}
                        if ng­to(a[i]) then writeln(a[i]);          {nếu ai là nguyên t thì in ra}
end;
func­tion UCLN(a,b: in­te­ger): in­te­ger;
var r : in­te­ger;
be­gin
            while b<>0 do be­gin
                        r := a mod b;
                        a := b;
                        b := r;
            end;
            UCLN := a;
end;
Th tc tính UCLN ca các phn t ca mt mng
pro­ce­dure Tin­hUC;
var i,u : in­te­ger;
be­gin
            u := a[1];                                               {u là UCLN ca các phn t t 1 đến i}
            for i := 2 to n do u := UCLN(u,a[i]);        {là UCLN ca các phn t t 1 đến i-1 và ai}
            writeln('UCLN cua ca day la:',u);                      
end;
func­tion ham­mu(a : re­al; n : in­te­ger): re­al; {hàm mũ tính an}
var s : re­al; i : in­te­ger;
be­gin
            s := 1;
            for i := 1 to n do s := s * a;
            ham­mu := s;
end;
Th tc tính tng các phn t có ly mũ:
pro­ce­dure tong;
var s : re­al; i : in­te­ger; {s phi khai báo là s thc để tránh tràn s}
be­gin
            s := 0;
            for i := 1 to n do s := s + ham­mu(a[i],i); {s := s + (ai)i}
            writeln('Tong can tinh:',s:10:0);
end;
Th tc sp xếp tăng dn các phn t ca mt mng:
pro­ce­dure sx­ep;
var i,j,tg : in­te­ger;
be­gin
            for i := 1 to n-1 do
                        for j := i + 1 to n do
                                    if a[i] > a[j] then be­gin
                                                tg := a[i]; a[i] := a[j]; a[j] := tg;
                                    end;
            writeln('DAY SAU KHI SAP XEP TANG DAN:');
            for i := 1 to n do writeln(a[i]);
end;
Chương trình chính: ln lượt gi tng th tc
BE­GIN
            nhap;
            in­ng­to;
            tin­huc;
            tong;
            sx­ep;
END.
BÀI TP 2
Tìm phn t nh nht, ln nht ca mt mng (cn ch ra c v trí ca phn t).
HƯỚNG DN
Gi s phn t min cn tìm là phn t k. Ban đầu ta cho k=1. Sau đó cho i chy t 2 đến n, nếu a[k] > a[i] thì rõ ràng a[i] bé hơn, ta gán k bng i. Sau khi duyt toàn b dãy thì k s là ch s ca phn t min. (Cách tìm min này đơn gin vì t v trí ta cũng suy ra được giá tr).
pro­ce­dure tim­min;
var i, k : in­te­ger;
be­gin
            k := 1;
            for i := 2 to n do
                        if a[k] > a[i] then k := i;
            writeln('Phan tu nho nhat la a[',k,']=',a[k]);
end;
Tìm max cũng tương t, ch thay du so sánh.
pro­ce­dure tim­max;
var i, k : in­te­ger;
be­gin
            k := 1;
            for i := 2 to n do
                        if a[k] < a[i] then k := i;
            writeln('Phan tu lon nhat la a[',k,']=',a[k]);
end;
Chú ý:
1. Nếu áp dng vi mng 2 chiu thì cũng tương t, ch khác là để duyt qua mi phn t ca mng 2 chiu thì ta phi dùng 2 vòng for. Và v trí mt phn t cũng gm c dòng và ct.
Ví d 1. Tìm phn t nh nht và ln nht ca mng 2 chiu và đổi ch chúng cho nhau:
pro­ce­dure ex­change;
var i,j,i1,j1,i2,j2,tg : in­te­ger;
be­gin
            i1 := 1; j1 := 1; {i1,j1 là v trí phn t min}
            i2 := 1; j2 := 1; {i2,j2 là v trí phn t max}
            for i := 1 to m do
                        for j := 1 to n do be­gin
                                    if a[i1,j1] > a[i,j] then be­gin {so sánh tìm min}
                                                i1 := i; j1 := j;     {ghi nhn v trí min mi}
                                    end;
                                    if a[i2,j2] < a[i,j] then be­gin {so sánh tìm max}
                                                i2 := i; j2 := j; {ghi nhn v trí max mi}
                                    end;
                        end;
            tg := a[i1,j1]; a[i1,j1] := a[i2,j2]; a[i2,j2] := tg; {đổi ch}
end;
2. Nếu cn tìm phn t ln nht / nh nht hoc sp xếp 1 dòng (1 ct) ca mng 2 chiu thì ta cũng coi dòng (ct) đó như 1 mng 1 chiu. Chng hn tt c các phn t trên dòng k đều có dng ch s là a[k,i] vi i chy t 1 đến n (n là s ct).
Ví d 2. Tìm phn t ln nht ca dòng k và đổi ch nó v phn t đầu dòng.
pro­ce­dure tim­max(k : in­te­ger);
var i, vt, tg : in­te­ger;
be­gin
            vt := 1; {vt là v trí ca phn t min dòng k}
            for i := 1 to n do
                        if a[k,i] > a[k,vt] then vt := i; {các phn t dòng k có dng a[k,i]}
            tg := a[k,1]; a[k,1] := a[k,vt]; a[k,vt] := tg;
end;
Ví d 3. Sp xếp gim dn ct th k.
pro­ce­dure sapx­ep(k: in­te­ger);
var i,j,tg : in­te­ger;
be­gin
            for i := 1 to m-1 do {mi ct có m phn t, vì bng có m dòng}
                        for j := i+1 to m do
                                    if a[i,k] > a[j,k] then be­gin {các phn t ct k có dng a[i,k]}
                                                tg := a[i,k]; a[i,k] := a[j,k]; a[j,k] := tg;
                                    end;
end;
BÀI TP 3
Tìm các phn t tho mãn 1 tính cht gì đó.
HƯỚNG DN
Nếu tính cht cn tho mãn là cn kim tra phc tp (chng hn: nguyên t, hoàn thin, có tng ch s bng 1 giá tr cho trước…) thì ta nên viết mt hàm để kim tra 1 phn t có tính cht đó không. Còn tính cht cn kim tra đơn gin (chn / l, dương / âm, chia hết, chính phương…) thì không cn.
Sau đó ta duyt qua các phn t t đầu đến cui, phn t nào tho mãn tính cht đó thì in ra.
Ví d 1. In ra các s chính phương ca mt mng:
Để kim tra n có chính phương không, ta ly căn n, làm tròn ri bình phương và so sánh vi n. Nếu biu thc sqr(round(sqrt(n))) = n là true thì n là chính phương.
Vy để in các phn t chính phương ta viết:
     for i := 1 to n do be­gin
         if sqr(round(sqrt(a[i]))) = a[i] then writeln(a[i]);
Ví d 2. In ra các s hoàn thin t 1 đến n:
Để kim tra s có hoàn thin ta dùng hàm tng ước (đã có phn đầu).
     for i := 1 to n do be­gin
         if tongus(i) = i then writeln(i);
Ví d 3. In ra các phn t ca mng chia 3 dư 1, chia 7 dư 2:
     for i := 1 to n do be­gin
         if (a[i] mod 3=1) and (a[i] mod 7=2) then writeln(a[i]);
Ví d 4. In ra các s có 3 ch s, tng ch s bng 20, chia 7 dư 2.
Ta dùng hàm tng ch s đã có trên:
     for i := 100 to 999 do be­gin {duyt qua mi s có 3 ch s}
         if (tongcs(i)=20) and (i mod 7=2) then writeln(i);
Chú ý: Nếu áp dng vi mng 2 chiu thì cũng tương t, ch khác là để duyt qua mi phn t ca mng 2 chiu thì ta phi dùng 2 vòng for.
Ví d, để in các phn t nguyên t ca 1 mng 2 chiu:
     for i := 1 to m do be­gin
     for j := 1 to n do be­gin
         if ng­to(a[i,j]) then writeln(a[i,j]);
BÀI TP 4
Nhp và in mng 2 chiu dng ma trn (m dòng, n ct).
HƯỚNG DN
Để nhp các phn t ca mng 2 chiu dng ma trn, ta cn dùng các lnh sau ca unit CRT (nh phi có khai báo us­er crt đầu chương trình).
Go­toXY(a,b): di chuyn con tr màn hình đến v trí (a,b) trên màn hình (ct a, dòng b). Màn hình có 80 ct và 25 dòng.
whereX: hàm cho giá tr là v trí ct ca con tr màn hình.
whereY: hàm cho giá tr là v trí dòng ca con tr màn hình.
Khi nhp 1 phn t ta dùng lnh readln nên con tr màn hình s xung dòng, do đó cn quay li dòng ca bng lnh Go­toXY(j * 10, whereY -1 ), nếu ta mun mi phn t ca ma trn ng vi 10 ct màn hình.
pro­ce­dure nhap;
var i,j : in­te­ger;
be­gin
            clrscr;
            write('Nhap m,n =  '); readln(m,n);
            for i := 1 to m do be­gin
                        for j := 1 to n do be­gin
                                    write('A[',i,',',j,']=');  readln(a[i,j]); {nhp xong thì xung dòng}
                                    go­toXY(j*10,whereY-1); {di chuyn v dòng trước, v trí tiếp theo}
                        end;
                        writeln; {nhp xong 1 hàng thì xung dòng}
            end;
end;
Để in bng dng ma trn thì đơn gin hơn, vi mi dòng ta s in các phn t trên 1 hàng ri xung dòng:
pro­ce­dure in­bang;
var i,j : in­te­ger;
be­gin
            for i := 1 to m do be­gin                           {viết các phn t ca hàng i }
                        for j := 1 to n do write(a[i,j]:6);    {mi phn t chiếm 6 ô để căn phi cho thng ct và không sít nhau}
                        writeln; {hết 1 hàng thì xung dòng}
            end;
end;
CÁC BÀI TP V XÂU KÍ T
BÀI TP 1
Nhp vào mt xâu s khác rng và thc hin chun hoá xâu, tc là:
a)      Xoá các du cách tha
b)      Chuyn nhng kí t đầu t thành ch hoa, nhng kí t khác thành ch thường.
HƯỚNG DN
Chương trình như sau:
var s : string;
pro­ce­dure chuan­hoa(var s : string); {s là tham biến để có th thay đổi trong chương trình con}
var i : in­te­ger;
be­gin
     while s[1]=' ' do delete(s,1,1); {xoá các kí t cách tha đầu xâu}
     while s[length(s)]=' ' do delete(s,length(s),1); {xoá các kí t cách tha cui xâu}
{xoá các kí t cách tha gia các t: nếu s[i-1] là cách thì s[i] là du cách là tha. Phi dùng vòng lp for down­to vì nếu trong quá trình xoá ta làm gim chiu dài ca xâu, nếu for to s không dng được.}
     for i := length(s) down­to 2 do
         if (s[i]=' ') and (s[i-1]=' ') then delete(s,i,1);
{Chuyn kí t đầu xâu thành ch hoa}
     s[1] := Up­case(s[1]);
     for i := 2 to length(s) do
         if s[i-1]=' ' then s[i] := Up­case(s[i]) {Chuyn s[i] là kí t đầu t thành ch hoa.}
         else
             if s[i] in ['A'..'Z'] then   {s[i] là kí t ch hoa không đầu mt t}
                s[i] := chr(ord(s[i]) + 32); {thì phi chuyn thành ch thường}
end;
BE­GIN
   write('Nhap vao 1 xau s:');
   readln(s);
   chuan­hoa(s);
   writeln('Xau s sau khi chuan hoa:',s);
   readln;
END.
BÀI TP 2
Nhp vào mt xâu x khác rng và thông báo xâu đó có phi là xâu đối xng hay không?
HƯỚNG DN
Xâu đối xng nếu nó bng chính xâu đảo ca nó. Vy cách đơn gin nht là ta s xây dng xâu đảo ca x và kim tra xem nó có bng x không. Để xây dng xâu đảo ca x, cách đơn gin nht là cng các kí t ca x theo th t ngược (t cui v đầu).
Chương trình:
var x : string;
(************************************************)
func­tion doix­ung(x : string) : boolean; {hàm kim tra xâu đối xng}
var y : string;
    i : in­te­ger;
be­gin
     y := '';
{xây dng y là xâu đảo ca x, bng cách cng dn các kí t ca x vào y theo th t ngược}
     for i := length(x) down­to 1 do y := y + x[i];
{so sánh x và xâu đảo ca nó}
     if x=y then doix­ung := true else doix­ung := false;
end;
BE­GIN
     write('Nhap vao 1 xau:');
     readln(x);
     if doix­ung(x) then
        writeln('Xau doi xung!')
     else
        writeln('Xau khong doi xung!');
     readln;
END.
BÀI TP 3
Nhp vào mt xâu s và đếm xem nó có bao nhiêu t. T là mt dãy các kí t, cách nhau bi du cách?
HƯỚNG DN
Cách đếm t đơn gin nht là đếm du cách: nếu s[i] là kí t khác cách và s[i-1] là kí t cách thì chng t s[i] là v trí bt đầu ca mt t. Chú ý là t đầu tiên ca xâu không có du cách đứng trước.
Chương trình:
var s : string;
{Hàm đếm s t ca mt xâu}
func­tion so­tu(s : string) : in­te­ger;
var i, dem : in­te­ger;
be­gin
{cng thêm du cách phía trước xâu để đếm c t đầu tiên}
     s := ' ' + s; dem := 0;
     for i := 2 to length(s) do {s[i] là v trí bt đầu 1 t}
         if (s[i-1]=' ') and (s[i]<>' ') then dem := dem + 1;
     so­tu := dem;
end;
BE­GIN
     write('Nhap vao 1 xau:');
     readln(s);
     writeln('So tu trong xau la:',so­tu(s));
     readln;
END.
BÀI TP 4
Nhp vào mt xâu s và in ra các t ca nó (T là mt dãy các kí t, cách nhau bi du cách). Xâu có bao nhiêu tđối xng?
HƯỚNG DN
Có nhiu cách để tách mt xâu thành các t. Cách đơn gin nht tiến hành như sau:
1)      B qua các du cách cho đến khi gp mt kí t khác cách (hoc hết xâu).
2)      Ghi các kí t tiếp theo vào xâu tm cho đến khi gp du cách hoc hết xâu, khi đó ta được 1 t.
3)      Nếu chưa hết xâu thì quay li bước 1.
Mi khi tìm được mt t, ta ghi luôn nó ra màn hình, nếu t đó là đối xng thì tăng biến đếm. Ta cũng có th lưu các t tách được vào mt mng nếu bài tp yêu cu dùng đến nhng t đó trong các câu sau.
Chương trình:
var s : string;
    dem : in­te­ger;
{Hàm kim tra t đối xng}
func­tion doix­ung(x : string) : boolean;
var y : string;
    i : in­te­ger;
be­gin
     y := '';
     for i := length(x) down­to 1 do y := y + x[i];
     if x=y then doix­ung := true else doix­ung := false;
end;
{Th tc thc hin tách t}
pro­ce­dure tach;
var i, len : in­te­ger;
    t : string;
be­gin
     writeln('Cac tu trong xau:');
     i := 1; len := length(s);
     re­peat
{B1: b qua các du cách cho đến khi hết xâu hoc gp 1 kí t khác cách:}
           while (s[i]=' ') and (i<=len) do inc(i);
           if i>=len then break; {nếu hết xâu thì dng}
           t := '';                             {t là biến tm lưu t đang tách}
{B2: ly các kí t khác cách đưa vào biến tm cho đến khi hết xâu hoc gp 1 kí t cách:}
           while (s[i]<>' ') and (i<=len) do be­gin
                 t := t + s[i];
                 inc(i);
           end;
{in ra t va tách được và kim tra đối xng}
           writeln(t);
           if doix­ung(t) then inc(dem);
     un­til i >= len;
     writeln('So tu doi xung trong xau:',dem);
end;
(************************************************)
BE­GIN
     write('Nhap vao 1 xau:');
     readln(s);
     tach;
END.
BÀI TP 5
Mt s nguyên gi là palin­drome nếu nó đọc t trái sang cũng bng đọc t phi sang. Ví d 121 là mt s palin­drom. Nhp mt dãy n phn t nguyên dương t bàn phím, 5<= n<=20 và các phn t có 2 đến 4 ch s. In ra các s là palin­drom trong dãy.
HƯỚNG DN
Mt s là palin­drome thì xâu tương ng ca nó là xâu đối xng. Ta s xây dng mt hàm kim tra mt s có phi là palin­drome không bng cách chuyn s đó thành xâu và kim tra xâu đó có đối xng không?
Chương trình:
us­es crt;
var  n : in­te­ger;
     a : ar­ray[1..20] of in­te­ger;
{Th tc nhp d liu}
pro­ce­dure nhap;
var i : in­te­ger;
be­gin
     clrscr;
     re­peat
           write('n= '); readln(n);
           if (n<=20) and (n>=5) then break; {nếu đã tho mãn thì thoát khi vòng lp}
           writeln('Yeu cau 5<=n<=20. Nhap lai!');
     un­til false;
     for i := 1 to n do
          re­peat
                write('A[',i,']='); readln(a[i]);
                if (a[i]<=9999) and (a[i]>=10) then break; {a[i] có 2 đến 4 ch s}
                writeln('Yeu cau cac phan tu co 2 den 4 chu so. Nhap lai!');
          un­til false;
end;
{Hàm kim tra bng các kim tra xâu đối xng}
func­tion palin­drome(k : in­te­ger): boolean;
var x,y : string;
    i : in­te­ger;
be­gin
     str(k,x);        {chuyn k thành xâu x}
     y := '';
     for i := length(x) down­to 1 do y := y + x[i];
{nếu x là đối xng thì k là palin­drome}
     if x=y then palin­drome := true else palin­drome := false;
end;
{In kết qu:}
pro­ce­dure palin;
var i : in­te­ger;
be­gin
     writeln('Cac so la palin­drom trong day:');
     for i := 1 to n do
         if palin­drom(a[i]) then writeln(a[i]);
     readln;
end;
(* Chương trình chính *)
BE­GIN
     nhap;
     palin;
END.
CÁC BÀI TP V TP
BÀI TP 1
Nhp mt mng 2 chiu m dòng, n ct t file BANG­SO.TXT. Cu trúc file như sau: dòng đầu là 2 s m và n, cách nhau bng du cách, m dòng sau, mi dòng n s nguyên.
a)      Hãy in ra nhng s là s nguyên t ca mng.
b)      Tìm v trí phn t ln nht trong mng.
c)       Sp xếp mi dòng ca mng tăng dn và in ra mng dng ma trn.
HƯỚNG DN
Ta khai báo mt mng 2 chiu và nhp d liu t file vào mng. Quá trình nhp t file văn bn ging như nhp t bàn phím, không cn thc hin kim tra d liu.
Để sp xếp mng theo yêu cu, ta thc hin sp xếp tng dòng ca mng bng cách viết mt th tc sp xếp (kiu đổi ch cho đơn gin) coi mi dòng ca mng như 1 mng 1 chiu.
Chương trình:
var m,n : in­te­ger;
    a : ar­ray[1..100,1..100] of in­te­ger;
(* Nhp d liu *)
pro­ce­dure nhap;
var f : text;
    i,j : in­te­ger;
be­gin
     as­sign(f,'BANG­SO.TXT'); re­set(f);
     readln(f,m,n);
     for i := 1 to m do
         for j := 1 to n do read(f,a[i,j]);
     close(f);
end;
func­tion ng­to(k : in­te­ger): boolean;
var i : in­te­ger;
be­gin
     ng­to := false;
     if k < 2 then ex­it;
     for i := 2 to round(sqrt(k)) do
         if k mod i = 0 then ex­it;
     ng­to := true;
end;
pro­ce­dure in­ng­to;
var i,j : in­te­ger;
be­gin
     writeln('Cac phan tu nguyen to cua mang:');
     for i := 1 to m do
         for j := 1 to n do
             if ng­to(a[i,j]) then write(a[i,j],' ');
     writeln;
end;
pro­ce­dure tim­max;
var max,i,j,im,jm : in­te­ger;
be­gin
     max := a[1,1]; im := 1; jm := 1; {im, jm lưu to độ phn t đạt max}
     for i := 1 to m do
         for j := 1 to n do
             if max < a[i,j] then be­gin
                max := a[i,j];  {mi ln gán max thì gán to độ luôn}
                im := i; jm := j;
             end;
     writeln('Phan tu lon nhat bang la A[',im,',',jm,']=',max);
end;
{Th tc thc hin sp xếp tăng dn dòng th k. Các phn t dòng k có dng a[k,i]}
pro­ce­dure xep­dong(k: in­te­ger);
var i,j, tg : in­te­ger;
be­gin
     for i := 1 to n do
         for j := i+1 to n do
             if a[k,i] > a[k,j] then be­gin
                tg := a[k,i]; a[k,i] := a[k,j]; a[k,j] := tg;
             end;
end;
pro­ce­dure sapx­ep;
var i,j : in­te­ger;
be­gin
     for i := 1 to m do xep­dong(i); {sp xếp tng dòng}
     writeln('Mang sau khi sap xep:');
     for i := 1 to m do be­gin                      {in dng ma trn}
         for j := 1 to n do write(a[i,j] : 5); {in các phn t trên 1 dòng}
         writeln;                {in hết 1 dòng thì xung dòng}
     end;
end;
BE­GIN
     nhap;
     in­ng­to;
     tim­max;
     sapx­ep;
END.
BÀI TP 2
Nhp 2 s m, n t bàn phím, sau đó sinh ngu nhiên m´n s nguyên ngu nhiên có giá tr t 15 đến 300 để ghi vào file BANG.TXT. Sau đó thc hin các yêu cu sau:
a)      In m´n s đã sinh dng ma trn m dòng, n ct.
b)      In ra các s chính phương.
Yêu cu: không được dùng mng 2 chiu để lưu tr d liu.
HƯỚNG DN
Do yêu cu không được dùng mng 2 chiu để lưu tr d liu nên ta s đọc file đến đâu, xđến đấy.
-         Để sinh các s ngu nhiên t a đến b, ta dùng biu thc a + ran­dom(b-a+1).
-         Để kim tra s k có phi là s chính phương không, ta ly căn bc 2 ca k, làm tròn ri bình phương. Nếu kết qu bng k thì k là s chính phương. Tc là kim tra sqr(round(sqrt(k))) = k.
Chương trình:
var m,n : in­te­ger;
    f : text;
pro­ce­dure sinh;
var
    i,j : in­te­ger;
be­gin
     write('Nhap vao 2 so m,n: '); readln(m,n);
     as­sign(f,'BANG.TXT'); rewrite(f);
     writeln(f,m,' ',n);
     for i := 1 to m do be­gin
         for j := 1 to n do
             write(f,15 + ran­dom(300-15+1) : 6); {sinh s ngu nhiên t 15 đến 300}
         writeln(f);
     end;
     close(f);
end;
{Hàm chính phương}
func­tion cp(k : in­te­ger) : boolean;
be­gin
     if sqr(round(sqrt(k))) = k then cp := true
     else cp := false;
end;
pro­ce­dure chinh­phuong;
var
    i,j,k : in­te­ger;
be­gin
     as­sign(f,'BANG.TXT'); re­set(f);
     readln(f,m,n);
     writeln('CAC SO CHINH PHUONG CUA BANG:');
     for i := 1 to m do be­gin
         for j := 1 to n do be­gin
             read(f,k);
             if cp(k) then write(k,' '); {va đọc va x lí}
         end;
     end;
     close(f);
end;
pro­ce­dure in­bang;
var
    i,j,k : in­te­ger;
be­gin
     as­sign(f,'BANG.TXT'); re­set(f); {m li để in dng ma trn}
     readln(f,m,n);
     writeln(#10,'IN BANG DANG MA TRAN:');
     for i := 1 to m do be­gin
         for j := 1 to n do be­gin
             read(f,k);
             write(k : 6);      {đọc đến đâu in đến đó}
         end;
         writeln;
     end;
     close(f);
end;
BE­GIN
     sinh;
     chinh­phuong;
     in­bang;
END.
CÁC BÀI TP V BN GHI
BÀI TP 1
Viết chương trình qun lí sách. Mi cun sách gm tên sách, tên nhà xut bn, năm xut bn, giá tin, s lượng:
a)      Đưa ra danh sách các cun sách ca nhà xut bn Giáo dc.
b)      Tính tng s tin sách.
c)       Sp xếp danh sách theo năm xut bn gim dn và ghi kết qu ra màn hình.
d)      In ra màn hình các cun sách có giá tin<=10.000đ và xut bn sau năm 2000.
HƯỚNG DN
Mô t mi cun sách là mt bn ghi, các thông tin v nó (tên sách, tên tác gi,…) là các trường. Danh sách cun sách s là mt mng các bn ghi.
Khai báo kiu d liu mô t sách như sau:
type
    sach = record
         ten : string[30];                 {tên sách}
         nxb  : string[20];               {tên Nhà xut bn}
         namxb   : in­te­ger;  {năm xut bn}
         solu­ong : in­te­ger;  {s lượng}
         gia : re­al;              {giá tin}
    end;
Thông tin ca tt c các cun sách ta lưu trong mt mng các bn ghi kiu sach:
var
   ds : ar­ray[1..100] of sach;
   n : in­te­ger;
Nhp d liu: ta nhp tên sách trước. Nếu tên sách là xâu rng thì đừng nhp, ngược li ln lượt nhp các thông tin khác:
   pro­ce­dure nhap;
   var t : string;
   be­gin
        ClrScr;
        writeln('NHAP THONG TIN VE CAC CUON SACH');
        writeln('(nhap ten sach la xau rong neu muon dung)');
        re­peat
              write('Ten sach:  ');
              readln(t);
              if t='' then break;
              n := n + 1;
              with ds[n] do be­gin
                 ten := t;
                 write('NXB:  ');readln(nxb);
                 write('Nam xu­at ban:  ');readln(namxb);
                 write('So lu­ong:  ');readln(solu­ong);
                 write('Gia tien:  ');readln(gia);
              end;
        un­til false;
   end;
Câu a: ta s duyt qua toàn b danh sách các cun sách, kim tra nếu tên nhà xut bn là Giáo dc thì in ra tt c các thông tin ca cun sách tương ng:
   pro­ce­dure in­sach;
   var
      i   : in­te­ger;
   be­gin
        Clrscr;
        writeln('CAC CUON SACH CUA NXB GI­AO DUC:');
        for i:=1 to n do
            with ds[i] do
                 if nxb='Gi­ao duc' then be­gin
                    writeln('Ten:',ten);
                    writeln('Nam xu­at ban:',namxb);
                    writeln('So lu­ong:',solu­ong);
                    writeln('Gia tien:',gia);
                 end;
        readln;
   end;
Câu b: ta cũng duyt qua toàn b các cun sách, nhân s lượng và giá tin ri cng dn vào mt biến tng. Sau đó in ra biến tng đó:
pro­ce­dure tinh;
var i : in­te­ger;
    tong : re­al;
be­gin
     tong := 0;
     for i := 1 to n do
         with ds[i] do tong := tong + gia * solu­ong;
     writeln('TONG GIA TRI CUA TAT CA CAC CUON SACH:', tong:0:3);
end;
Câu c: Sp xếp danh sách gim dn theo năm xut bn bng phương pháp ni bt (2 vòng for). Chú ý biến trung gi­an trong đổi ch phi có kiu sach thì mi gán được.
pro­ce­dure sx­ep;
var i,j : in­te­ger;
    tg : sach;
be­gin
     for i := 1 to n do
         for j := i + 1 to n do
             if ds[i].namxb < ds[j].namxb then be­gin
                tg := ds[i]; ds[i] := ds[j]; ds[j] := tg;
             end;
     for i:=1 to n do
        with ds[i] do be­gin
             writeln('Ten:',ten);
             writeln('Nam xu­at ban:',namxb);
             writeln('So lu­ong:',solu­ong);
             writeln('Gia tien:',gia);
        end;
     readln;
end;
Câu d: ta làm tương t vic in danh sách các sách ca NXB Giáo dc:
pro­ce­dure inds;
var i : in­te­ger;
be­gin
     writeln('CAC CUON SACH GIA RE HON 10000 VA XU­AT BAN TU NAM 2000:');
     for i := 1 to n do
         with ds[i] do
              if (gia <= 10000) and (namxb >= 2000) then writeln(ten);
end;
Chương trình chính: Ln lượt gi các chương trình con theo th t:
BE­GIN
     nhap;
     in­sach;
     tinh;
     sx­ep;
     inds;
     readln;
END.
BÀI TP 2
Viết chương trình qun lí cán b. Thông tin v cán b gm tên, tui, h s lương, ph cp, thu nhp.
a)      Nhp thông tin cán b t file văn bn CAN­BO.TXT. Các thông tin gm tên, tui, h s lương, ph cp, mi thông tin trên mt dòng.
Tính thu nhp = h s lương ´ 350000đ + ph cp
b)      Đưa ra danh sách các b tr (tui <= 30), in đầy đủ các thông tin
c)       Sp xếp tên cán b theo abc và ghi lên file truy cp trc tiếp SAPX­EP.DAT.
d)      Đọc danh sách t file SAPX­EP.DAT, in ra màn hình các cán b có thu nhp t 3 triu tr lên.
HƯỚNG DN
Làm tương t bài 1, chú ý là nhp d liu t file ch không phi t bàn phím. Do đó không cn ghi các thông tin yêu cu nhp ra màn hình. Hơn na, phi to trước mt file văn bn là CAN­BO.TXT để chương trình có th chy mà không báo li.
Toàn văn chương trình:
us­es crt;
type
    can­bo = record
          ten : string[20];
          tuoi : byte;
          hsl, phu­cap, thun­hap: re­al;
    end;
var
   ds : ar­ray[1..100] of can­bo;
   n : in­te­ger;
(*********************************************)
pro­ce­dure nhap;
var f : text;
be­gin
     as­sign(f,'CAN­BO.TXT'); re­set(f);
     n := 0;
     while not eof(f) do be­gin
           n := n + 1;
           with ds[n] do be­gin
                readln(f,ten);
                readln(f,tuoi);
                readln(f,hsl);
                readln(f,phu­cap);
                thun­hap := hsl * 350000 + phu­cap;
           end;
     end;
     close(f);
end;
(*********************************************)
pro­ce­dure in30;
var i : in­te­ger;
be­gin
     writeln('DANH SACH CAC CAN BO TRE:');
     for i := 1 to n do
         with ds[i] do
              if tuoi <= 30 then be­gin
                 writeln('Ten:',ten);
                 writeln('Tuoi:',tuoi);
                 writeln('He so lu­ong:',hsl :0 :3);
                 writeln('Phu cap:',phu­cap :0 :3);
                 writeln('Thu nhap:',thun­hap :0 :3);
              end;
end;
(*********************************************)
pro­ce­dure sx­ep;
var i,j : in­te­ger;
    tg : can­bo;
be­gin
     for i := 1 to n do
         for j := i + 1 to n do
             if ds[i].ten > ds[j].ten then be­gin
                tg := ds[i]; ds[i] := ds[j]; ds[j] := tg;
             end;
end;
(*********************************************)
pro­ce­dure ghitep;
var f : file of can­bo;
    i : in­te­ger;
be­gin
     as­sign(f,'SAPX­EP.DAT'); rewrite(f);
     for i := 1 to n do write(f,ds[i]);
     close(f);
end;
pro­ce­dure doctep;
var f : file of can­bo;
    i : in­te­ger;
be­gin
     as­sign(f,'SAPX­EP.DAT'); re­set(f);
     i := 0;
     while not eof(f) do be­gin
           i := i + 1;
           read(f,ds[i]);
     end;
     n := i;
     close(f);
end;
(*********************************************)
pro­ce­dure in3M;
var i : in­te­ger;
be­gin
     writeln('DANH SACH CAC CAN BO CO THU NHAP CAO:');
     for i := 1 to n do
         with ds[i] do
              if thun­hap >= 3000000 then be­gin
                 writeln('Ten:',ten);
                 writeln('Tuoi:',tuoi);
                 writeln('Thu nhap:',thun­hap :0 :3);
              end;
end;
(*********************************************)
BE­GIN
     nhap;
     in30;
     sx­ep;
     in3M;
     readln;
END.
THUAÄT TOAÙN( GI­AÛI THUAÄT)
       I)Khaùi Nieäm Thuaät Toaùn:
1)gi­aûi thuaät cuûa moät baøi toaùn laø moät heä thoáng caùc quy taéc chaët cheõ vaø roõ raøng  chaèm xaùc ñònh moät daõy caùc thao taùc treân nhöõng döõ lieäu vaøo ( IN­PUT) , sao cho sau moät soá höõu haïn böôùc  thöïc hieän caùc thao taùc ta thu ñöôïc keát quaû( OUT­PUT) cuûa baøi toaùn
2)Ví duï: cho hai soá nguyeân a,b . caàn xaây döïng gi­aûi thuaät ñeå tìm öôùc soá chung lôùn nhaát (US­CLN) cuûa hai soá a vaø b. Döôùi ñaäy laø gi­aûi thuaät cuûa nhaø toaùn hoïc coå Hy Laïp Ôcliñeà xu­aát cho baøi toaùn treân:
Gi­aûi thuaät Ôclid:
-         IN­PUT: a,b nguyeân
-         OUT­PUT: US­CLN cuûa a vaø b.
Böôùc 1: Chia a cho b tìm soá dö laø r
Böôùc 2: Neáu r=0 thì thoâng baùo keát quaû: US­CLN laø b . Döøng gi­aûi thuaät
Böôùc 3: Neáu r ¹ 0 thì gaùn trò b cho a , gaùn trò r cho b roài quay veà böôùc 1
caùc thao taùc goàm:
-         Pheùp tìm dö: chia soá nnguyeân a cho soá nguyeân b ñeå tìm soá dö laø r
-         Pheùp gaùn trò: ñöa moät gi­aù trò cuï theå vaøo moät bieán naøo ñoù .
-         Pheùp chuyeån ñieàu khieån: cho pheùp thöïc hieän tieáp töø moät böôùc naøo ñoù ( neáu khoâng coù  gaëp pheùp chuyeån tieáp thì maùy seõ thöïc hieän tu­aàn töï : sau böôùc i laø böôùc i+1)
Sau ñaây laø phaàn theå hieän gi­aûi thuaät Ôclid cuûa Ngoân ngöõ PAS­CAL thoâng qua moät chöông trình con laø Haøm.
{***************************************************}
 FUNC­TION     US­CLN( a,b:in­te­ger) :In­te­ger;
                             var   r :in­te­ger;
                                Be­gin
                   While b<>0  do
be­gin
                             r:= a mod b;
                             a:=b;
                             b:=r;
end;
                                      US­CLN:=a;
                             END;
{***************************************}
II). Caùc ñaëc tröng cuûa thuaät toaùn:
                      1)Thuaät toaùn phaûi coù tính döøng:
sau moät soá höõu haïn böôùc thì  phaûi döøng thuaät toaùn  vaø cho ra keát quaû
Ví duï: trong thuaät toaùn Ôclid sau khi thöïc hieän böôùc 1 chia a cho b ñeå tìm soá dö r ta coù  0<r£b  Do ñoù neáu r=0 thì thuaät toaùn döøng sau khi thöïc hieän böôùc 2, coøn r¹ 0 thì  sau böôùc 3 seõ coù pheùp gaùn trò  cuûa b cho a vaø cuûa r cho b neân ta thu ñöôïc 0<b<a . Ñieàu naøy coù nghóa laø soá dö laàn sau nhoû hôn soá dö  laàn tröôùc. Neân sau moät höõu haïn böôùc thöïc hieän thì r=0 vaø döøng thuaät toaùn.
                      2)Thuaät toaùn coù tính xaùc ñònh:
Ñoøi hoûi thuaät toaùn sau moãi böôùc  caùc thao taùc phaûi heát söùc roõ raøng, khoâng neân gaây  söï nhaäp nhaèng , tuyø tieän. noùi caùch khaùc trong cuøng moät ñieàu kieän thì xöû lyù ôû nôi naøo cuõng cho moät keát quaû.
                      3)Thuaät toaùn xöû lyù ñaïi löôïng vaøo(IN­PUT):
Moät gi­aûi thuaät thöôøng  coù moät hoaëc nhieàu ñaïi löôïng vaøo maø ta goïi laø döõ lieäu vaøo. caùc döõ lieäu thöôøng bieán thieân trong moät mieàn cho tröôùc.
                     4)Thuaät toaùn xöû lyù ñaïi löôïng ra( OUT­PUT):
Sau khi thuaät toaùn thöïc hieän xong, tuyø theo chöùc naêng maø thuaät toaùn  ñaûm nhaän ta coù theå thu ñöôïc moät soá keát quaû ta goïi laø ñaïi löôïng ra.
                    5)Thuaät toaùn phaûi coù tính hieäu quaû:
 moät baøi toaùn coù theå coù nhieàu thuaät toaùn  ñeå gi­aûi. Trong soá caùc thuaät toaùn ta caàn choïn thuaät toaùn toát nhaát ,nghóa laø thuaät toaùn phaûi thöïc hieän nhanh, toán ít boä nhôù.
                    6)Thuaät toaùn phaûi coù tính phoå duïng:
 laø thuaät toaùn coù khaû naêng gi­aûi ñöôïc moät lôùp lôùn caùc baøi toaùn.
III)caùc ví duï veà giaûi thuaät moät soá baøi toaùn vieát...
    BAØI TOAÙN 1:
“Vieát caùc haøm kieåm tra xem moät soá coù phaûi laø soá nguyeân toá   (soá chính phöông, soá hoaøn haûo)  hay khoâng ? Tìm öôùc soá chung lôùn nhaát cuûa 2 soá ?”
Gi­aûi thuaät cho baøi naøy laø raát quen thuoäc.
* Veà soá nguyeân toá : N ñöôïc goïi laø soá nguyeân toá  neáu N khoâng chia heát caùc soá ñi töø 2 cho ñeán  Round( sqrt(N)).
•        Veà soá chính phöông: N ñöôïc goïi laø soá chính phöông neáu phaàn thaäp phaân cuûa Sqrt(n) laø baèng 0.
•        Veà soá hoaøn haûo: N ñöôïc goïi laø soá hoaøn haûo neáu noù baèng toång caùc öôùc cuûa noù( khoâng keå chính noù)  ví duï:  N=  6 ,N=  28
{Toaøn vaên chöông trình}
                  
Us­es    Crt;
Var      i:In­te­ger;
         {***********************************************}
            Func­tion Sont(n:In­te­ger):Boolean;{ haøm kieåm tra soá nguyeân toá}
                           Var      i:In­te­ger;
                   Be­gin
             Sont:=False;
            For i:=2 to Round(Sqrt(n)) do
            If n Mod i=0 Then Ex­it;
             Sont:=True;
           End;
          {**********************************************}
Func­tion Cphuong(n:in­te­ger):Boolean;{ kieåm tra soá chính phöông}
Be­gin
Cphuong:=sqrt(n)=Round(sqrt(n));
End;
{**********************************************}
Func­tion Hoan­hao(n:in­te­ger):Boolean;
             Var           s,i:in­te­ger;
Be­gin
s:=0;
for i:=1 to n div 2 do
if n Mod i=0 Then s:=s+i;
Hoan­hao:=s=n;
End;
{************************************************}
  Func­tion Us­cln(a,b:In­te­ger):In­te­ger;
         Var     r :In­te­ger;
           Be­gin
                     While b<>0 Do
                  Be­gin
r:=a Mod b;
a:=b;
b:=r;
                           End;
                             Us­cln:=a;
                    End;
          {***********************************************}
Be­gin
{Chöông trình chính}
 End.
BAØI TOAÙN 2:
“Tìm caùc soá M ,N sao cho toång caùc öôùc döông cuûa M baúng N vaø toång caùc öôùc döông cuûa N baúng M vôùi  M,N < longint”
yùù töôûng gi­aûi thuaät:
                -Vieát haøm tính toång caùc öôùc döông cuûa moät soá.
                -Duyeät I=1..n. ñeå baøi toùan chaïy trong thôøi gi­an chaáp nhaän ta ñaët k= tonguoc(i);                      Khi ñoù neáu
TongUoc(k)=i thì toû raøng I vaø  k thoûa maõn ñeà baøi.
{Toøan vaên chöông trình}
{$B-}
Us­es Crt;
Var    k,n,i,j:Longint;
{*****************************************}
Func­tion TongUoc(a:Longint):Longint;
Var    t,s:Longint;
Be­gin
s:=0;
For t:=1 to a Div 2 do
if a Mod t =0 Then s:=s+t;
          TongUoc:=s;
End;
{*****************************************}
BE­GIN
Write(‘ nhap N=’);
Readln(N);
For i:=1 to  N do
Be­gin
k:=tonguoc(i);
if TongUoc(k)=i Then
Writeln(i,'   ',k);
End;
END.
{******************************}
BAØI TOAÙN 3:
“Phaân tích moät soá töï nhieân N thaønh tích caùc soá...
               Ví duï 90=2*3*3*5”
YÙ töôûng gi­aûi thuaät:
Chia lieân tieáp N cho öôùc  nguyeân toá beù nhaát cuûa N, quaù trình döøng laïi khi N=1, cöù moãi laàn thöïc hieän pheùp chia nhö vaäy ta gaùn laïi n := n Div Nt­min(n); trong ñoù Nt­min(n)  laø  haøm tìm  öôùc nguyeân toá beù nhaát cuûa N.
                   Haøm tìm öôùc nguyeân toá beù nhaát cuûa moät soá N laø deã hieåu nhö sau:
Cho I=2..n neáu i  laø soá nguyeân toá vaø n chia heát cho i  thì i chính laø öôùc nguyeân toá beù nhaát. haøm kieåm tra moät soá  coù phaûi laø soá nguyeân toá hay khoâng ñöôïc vieát bôûi haøm NT
{Toøan vaên chöông trình}
Us­es Crt;
Var    N:In­te­ger;
                   {********************************************}
Func­tion NT(n:In­te­ger):Boolean;
      Var        i:In­te­ger;
        Be­gin
Nt:=False;
For i:=2  To  N-1  Do
                       If n Mod i =0 Then Ex­it;
Nt:=True;
End;
                   {**********************************************}
      Func­tion NT­MIn(n:In­te­ger):In­te­ger;
                                Var           i:In­te­ger;
                                Be­gin
      For i:=2 to N do
                            If nt(i) and (N Mod i=0) Then
Be­gin
     nt­min:=i;
     Ex­it;
End;
End;
                {**********************************************}
BEGIN
            Re­peat
             Readln(n);
             Un­til n>1;
         While n<>1 DO
              Be­gin
                          Write(Nt­min(n):4);
                          n :=n Div Nt­min(n);
                             End;
                            END.
          BAØI TOAÙN 4:
Chuyeån ñoåi töø heä ñeám thaäp phaân sang heä ñeám La maõ vaø ngöôïc laïi.
yùù töôûng gi­aûi thuaät:
Chuyeån ñoåi soá N töø heä ñeám thaäp phaân sang heä ñeám La Maõ:
-Ñaët a=n Div 1000 thì soá töông öùng ôû heä ñeám lamaõ coù a kyù hieäu M.
-Ñoåi tuøng kyù soá haøng haøng traêm,haøng chuïc,haøng ñôn vò qua soá la maõ töông öùng vôùi caùc boä kyù soá (C,D,M),(X,L,C),(I,V,X).
Ví duï:4729
Thì a=4
7 traêm thì phaûi duøng boä M,D,C töùc laø soá DCC
2 chuïc thì phaûi duøng boä C,L,X töùc laø soá XX
9 ñôn vò thì phaûi duøng boä X,V,I töùc laø soá IX
Chuyeån ñoåi soá S töø heä ñeám heä ñeám La maõ sang thaäp phaân:
Gi­aû ta ñaõ coù haøm Doi(ch) ñeå ñoåi moät kyù soá töø heä la maõ sang heä thaäp phaân..Ñaët Tam=doi(s[Length(s)])
      -Xeùt töøng kyù soá lamaõ töø phaûi sang traùi.(i=length(s)-1..1)
- Neáu gi­aù trò cuûa moät kyù soá <= gi­aù trò cuûa kyù soá lieàn beân traùi noù thì keát quaû laø gi­aù  trò hieän taïi coäng vôùi gi­aù trò cuûa kyù soá ñang xeùt ngöôïc laïi thì tröø ñi gi­aù trò cuûa kyù soá ñang xeùt.
{Toøan vaên chöông trình}
Us­es Crt;
{************************************************}
Func­tion He10_sang_lama(n:In­te­ger):String;
          Var    s,CH1,CH2,CH3:String;
             a,b,K,H,i:In­te­ger;
Be­gin
s:='';
K:=1000;
H:=100;
a:=n Div k;
For i:=1 to a do s:=s+'M';
Re­peat
                                   case k of
                   1000:    Be­gin    CH1:='C';CH2:='D';CH3:='M';  End;
100:      Be­gin CH1:='X';CH2:='L';CH3:='C';  End;
10:         Be­gin CH1:='I';CH2:='V';CH3:='X';  End;
 End;
              b:=n Mod K Div H;
                         case b of
                    1:s:=s+CH1;
                    2:s:=s+CH1+CH1;
                    3:s:=s+CH1+CH1+CH1;
                    4:s:=s+CH1+CH2;
                    5:s:=s+CH2;
                    6:s:=s+CH2+CH1;
                     7:s:=s+CH2+CH1+CH1;
                     8:s:=s+CH2+CH1+CH1+CH1;
                     9:s:=s+CH1+CH3;
                      End;
                      K:=K Div 10;
                      H:=H Div 10;
            Un­til k=1;
                     He10_Sang_lama:=s;
                    End;
          {*********************************************}
      Func­tion lama_sang_he10(s:String):In­te­ger;
                                     Var   i,tam:In­te­ger;
               Func­tion doi(ch:char):In­te­ger;{ haøm doi laø chöông trình con cuûa ham   LaMa_sang_he_10}
                                      Var     k:In­te­ger;
                                 Be­gin
                                Case UP­CASE(ch) of
                             'M':k:=1000;
                              'D':k:=500;
                              'C':k:=100;
                              'L':k:=50;
                               'X':k:=10;
                               'V':k:=5;
                                'I':k:=1;
                                '0':k:=0;
                             End; { end of case}
          DOI:=K;
                      End;
         BE­GIN { baét ñaàu cuûa haøm}
                 Tam:=doi(s[length(s)]);
                     For i:=length(s)-1 down­to 1 do
                      if doi(s[i+1])<=doi(s[i]) Then
          Tam:=Tam+doi(s[i])
                    Else
               Tam:=Tam-doi(s[i]);
                         LAMA_sang_He10:=Tam;
                    END;{ keát thuùc haøm}
          {*************************************************}
BE­GIN { chöông trình chính}
Writeln(he10_sang_lama(4729));
END.
BAØI TOAÙN 5:
  Moät phaân soá s/t=[b1,b2,b3,...bk] vôùi bi laø keát quaû cuûa phaân tích sau:
                  1
               --------------------
                                        1
                       B1 + ----------------------
                                                  1
                               B2      + --------------------
                                                              1
                                                  B3    +  ----------------
                                                          B4      +                
          .................................                                                                                       1
                                                           BK-1 + -------
                                                                    BK
a)Cho tröôùc S/t haõy tìm daõy bi
b)Cho tröôùc daõy bi haõy tìm S/t
{Toaøn vaên chöông trình}
Us­es Crt;
Var    s,t,a,bb,i,k:In­te­ger;
b:ar­ray[1..12] of In­te­ger;
          {*********************************************}
Pro­ce­dure Cau_a;
Be­gin
Writeln('nhap s,t ');Readln(s,t);
i:=0;
While s<>0 Do
Be­gin
i:=i+1;
bb:=t div s;
a:=s;
s:=t-bb*s;
t:=a;
Write(bb:5);
End;
End;
          {***************************************************}
Pro­ce­dure Cau_b;
       Be­gin
Readln(k);
  For i:=1 to k do
Readln(b[i]);
s:=1;
t:=b[k];
For i:=k-1 down­to 1 do
Be­gin
a:=t;
 t:=t*b[i]+s;
 s:=a;
End;
            Writeln(s,'/',t);
                           End;
          {************************************************}
          BE­GIN
           Cau_a;
           Cau_b;
END.
BAØI TOAÙN 6:
“Haõy tính toång cuûa hai soá töï nhieân lôùn”
Baøi toaùn naøy coù nhieàu caùch gi­aûi sau ñaây chuùng toâi neâu leân moät lôøi gi­aûi töï nhieân nhaát nhöng cuõng raát hieäu quaû vaø deã hieåu nhö sau:
          Tröôùc heát ta ñi tìm haøm coäng hai chuoåi.
Func­tion Cong(s1,s2:String):String;
Var   L1,L2,Max,i,tam,a,b,code,nho:In­te­ger;
h,h1:String;
Be­gin
L1:=length(s1);
L2:=length(s2);
if L1>L2 Then Max:=L1 Else Max:=L2;
For i:=L1+1 to Max do
s1:='0'+s1;
For i:=L2+1 to Max do
s2:='0'+s2;
nho:=0;
h:='';
For i:=Max down­to 1 do
Be­gin
val(s1[i],a,code);
val(s2[i],b,code);
tam:=a+b+nho;
if tam>=10 Then nho:=1
 Else nho:=0;
str(tam Mod 10,h1);
h:=h1+h;
End;
if nho=1 Then h:='1'+h;
cong:=h;
End;
          {******************************************************}
Baây giôø chuùng ta tìm hieåu gi­aûi thuaät kinh ñieån cho daïng toaùn naøy nhö sau:
-Gi­aû söû hai soá ñöôïc cho bôûi chuoåi s1,s2
-Theâm 0 vaøo beân traùi soá coù chieàu daøi ngaén ñeå 2 chuoåi s1,s2 coù chieàu daøi baèng nhau vaø gi­aû söû chieàu daøi luùc ñoù laø Max.
-Tính c[i]=a[i]+b[i] vôùi moïi i(i=1..Max)
Ví duï: a=986
b=927
Thì c[1]=18;  c[2]=10;       c[3]=13;
-Ñeå C laø maûng soá keát quaû caàn bieán ñoåi moät chuùt nöõa nhö sau:
Duyeät maûng C töø phaûi qua traùi, moãi c[i] chæ giöõ laïi phaàn dö coøn phaàn nguyeân thì coäng theâm cho phaàn töû c[i-1] nhö sau:
For i:=Max down­to 1 do
Be­gin
c[i-1]:=c[i-1] + c[i] Div 10;
c[i]:=c[i] Mod 10;
End;
{Toaøn vaên chöông trình}
US­ES CRT;
Pro­ce­dure cong;
Var    s1,s2:String;
a,b,i,L1,L2,code,Max:Word;
c:Ar­ray[0..100] of In­te­ger;
Be­gin
Readln(s1);Readln(s2);
L1:=length(s1);
L2:=length(s2);
if L1>L2 Then Max:=L1 Else Max:=L2;
For i:=L2+1 to Max do
s2:='0'+s2;
For i:=L1+1 to Max do
 s1:='0'+s1;
Fillchar(C,SizE­of(c),0);
For i:=1 to Max do
Be­gin
val(s1[i],A,code);
val(s2[i],B,code);
c[i]:=a+b;
End;
For i:=Max down­to 1 do
Be­gin
c[i-1]:=c[i-1] + c[i] Div 10;
c[i]:=c[i] Mod 10;
End;
For i:=1 to Max do
Write(c[i]);
End;
BE­GIN
cong;
END.
Chöông trình tröø 2 soá töï nhieân lôùn thì vaát vaû hôn.theo yù töôûng laø laáy soá coù trò tuyeät ñoái lôn tröø ñi soá coù trò tuyeät ñoái nhoû vaø keát quaû seõ laø soá aâm neáu soá thöù nhaát beù hôn soá thöù 2, sau ñoù ñöa töøng kyù töï cuûa soá lôùn vaøo maûng h1, cuûa soá beù vaøo maûng h2.Neáu h1[i]<h2[i] thì                
c[i]:=h1[i]+10-h2[i];
vaø      h2[i-1]:=h2[i-1]+1;
ngöôïc laïi neáu h1[i]>=h2[i] thì
c[i]:=h1[i]-h2[i];
{Toøan vaên chöông trình}
Pro­ce­dure tru;
                             Var   s1,s2,s:String;
   h1,h2:Ar­ray[1..100] of In­te­ger;
   C:Ar­ray[1..100] of In­te­ger;
   dau:Char;
   code,l1,l2,Max,i:word;
Be­gin
Readln(s1);Readln(s2);
L1:=length(s1);
L2:=length(s2);
if L1>L2 Then Max:=L1 Else Max:=L2;
For i:=L2+1 to Max do
s2:='0'+s2;
For i:=L1+1 to Max do
s1:='0'+s1;
dau:=#32;
IF s2>s1 Then
 Be­gin
 dau:='-';
 s:=s2;
 s2:=s1;
 s1:=s;
                                     End;
Fillchar(C,SizE­of(c),0);
For i:=1 to Max do
Be­gin
 val(s1[i],h1[i],code);
 val(s2[i],h2[i],code);
 End;
 For i:=Max down­to 1 do
 Be­gin
 IF h1[i]<h2[i] Then
                                     Be­gin
                                                c[i]:=h1[i]+10-h2[i];
                                                h2[i-1]:=h2[i-1]+1;
                                        End
 Else
                                              c[i]:=h1[i]-h2[i];
                              End;
Write(dau);
For i:=1 to Max do
Write(c[i]);
End;
vaø chöông trình nhaân 2 soá töï nhieân lôùn ñöôïc vieát nhö sau:
{Toaøn vaên chöông trình}
Pro­ce­dure nhan;
Be­gin
Readln(s1);Readln(s2);
L1:=length(s1);
L2:=length(s2);               
Fillchar(C,SizE­of(c),0);
For i:=1 to L1 do
For j:=1 to L2 do
Be­gin
val(s1[i],A,code);
val(s2[J],B,code);
c[i+j]:=c[i+j]+a*b;
End;
For i:=L1+L2 down­to 3 do
Be­gin
c[i-1]:=c[i-1] + c[i] Div 10;
c[i]:=c[i] Mod 10;
End;
Write('Tich la : ');
      For i:=2 to L1+L2 do
Write(c[i]);
End.

Không có nhận xét nào:

Đăng nhận xét