Header Ads

Pascal cơ bản

Câu lệnh vòng lặp


Đề bài: Tìm ước chung lớn nhất và bội chung nhỏ nhất của hai số a và b được nhập từ bàn phím.
Ví dụ: Nhập a= 6 và  b=9
            Kết quả UCLN = 3 và BCNN = 18
 Ý tưởng: 
        - Lấy số lớn hơn trong 2 số trừ đi nhau. Lặp lại thao tác đến khi nào 2 số bằng nhau tìm được UCLN.
        - Lấy tích của 2 số chia cho UCLN tìm được BCNN. 

Thuật toán tìm Bội chung nhỏ nhất và Ước chung lớn nhất của 2 số trong Pascal: 

Cách 1: Dưới đây là thuật toán tìm UCLN bằng cách trừ đi nhau, được trình bày trong SGK tin học 10.
Chương trình
Var x,y,UCLN,BCNN:integer;
Begin 
    Readln(x,y); 
    BCNN:=x*y;
    While x<>y do 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 như trên. Các bạn có thể sử dụng cách chia lấy dư (mod), chương trình sẽ tối ưu do phải thực hiện ít phép tính hơn.
Ý tưởng: UCLN của 2 số x, y cũng là UCLN của 2 số y và x mod y, vậy ta sẽ đổi x là y, y là x mod y cho đến khi y bằng 0. Khi đó UCLN là x.
Chương trình
Var x,y,UCLN,BCNN,r:integer;
Begin
    readln(x,y); 
    BCNN:=x*y;
    r:= y mod x;
    While r <> 0 do
        Begin
            r:= x MOD y;
            x:= y;
            y:= r; 
        End;
    UCLN:=x;
    BCNN:=BCNN div UCLN;
    write(UCLN,' ',BCNN);
end.

Cách 3: Tìm UCLN bằng cách dùng đệ quy: Đệ quy được hiểu đơn giản là sự gọi nhiều lần chương trình con trong chương trình. Thực sự, đối với bài toán đơn giản, không ai sử dụng đệ quy vì sẽ 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 hiện nhiều phép tính hơn. Tuy nhiên, nếu bắt buộc phải dùng đệ quy, các bạn có thể tham khảo cách làm dưới đây: 

{Chương trình con}
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;
{Chương trình chính} 
Var x,y:integer;
Begin 
    readln(x,y); 
    write('Ước chung lớn nhất là: ', UCLN(x,y), ' Bội chung nhỏ nhất là: ', (x*y) div UCLN(x,y)); 
End.

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

Hình ảnh chủ đề của simonox. Được tạo bởi Blogger.