Câu: Viết chương trình bằng phương pháp khử đệ quy tìm ước chung lớn nhất của hai số: Bước 1: Input, Output Bước 2: Ý tưởng: + Thuật toán: B1: Nhập vào hai số a, b.. Câu: Lập chương trìn
Trang 1Câu: Viết chương trình bằng phương pháp khử đệ quy tìm ước chung lớn nhất của hai số:
Bước 1: Input, Output
Bước 2: Ý tưởng:
+ Thuật toán:
B1: Nhập vào hai số a, b
B2: Nếu b<>0 thì:
Du a mod b
A b;
B du;
Quay lại B2;
B3: Thông báo kết quả UCLN của a, b là a
Bước 3: Trình bày lời giải:
Var du, a, c: integer;
Begin
Write(‘Nhap 2 so a, b: ‘); readln(a,b);
While b<>0 do
Begin
D:=a mod b;
A:=b;
B:=du;
End;
Writeln(‘UCLN cua a va b: ‘, a);
Readln;
End
Bước 4: Xây dựng bộ kiểm thử:
TH1: a=15; b=9;
TH2: a=70; b=25;
TH3: a=10; b=7;
Câu: Viết chương trình bằng phương pháp khử đệ quy in ngược một số nguyên dương n.
Bước 1: Input, Output
Bước 2: + Ý tưởng:
+ Thuật toán:
B1: Nhập số N, Nếu N <0 quay lại bước 1
B2: S ‘’; str(N,S); I length(s);
B3: Nếu i>0 thì in S[i]; I i-1; quay lại B3
B4: Kết thúc
Bước 3:
Var n,i:integer; S:string;
Begin
Repeat
Writeln(‘Nhập N: ‘); readln(n);
Until n>0;
S:=’’; str(N,s); i:=length(S);
For i:=length(s) downto 1 do write(s[i]);
Trang 2End
Bước 4: Xây dựng bộ kiểm thử
TH1: N=123
TH2: N=246840
TH3: N=101214100
Câu: Lập chương trình kiểm tra 1 số N (nguyên dương) cho trước có phải:
a) Là một số nguyên tố
b) Là một số hoàn thiện
c) Là một số thỏa mãn tính chất A nào đó (là một số chính phương)
a) Bước 1: Input, Output
Bước 2: Tìm cách giải
+ Ý tưởng:
+ Thuật toán:
B1: Nhập N B2: I 2 B3: Nếu I > n thì đến B5 B4: Nếu n mod I <>0 thì I i+1 và quay lại B3
B5: Nếu i=n thì xuất n là số nguyên tố ngược lại xuất n không là số nguyên tố
Bước 3: Trình bày lời giải
Var I, n:integer
Begin
Write(‘Nhap n: ‘); readln(n);
I:=2;
While n mod I <> 0 do i:=i+1;
If i=n then write(n, ‘la so nguyen to’) Else write(n,’Khong la so nguyen to’);
Readln;
End
Bước 4:
+ N=6; N=17
b) Bước 1: Input, Output
Bước 2: + Ý tưởng:
+ Thuật toán:
B1: Nhập n;
B2: I 1; t 0;
B3: Nếu I >= n thì qua B5 B4: Nếu n mod I = 0 thì tt+I, I i+1 và quay lại B3
B5: Nếu T=n thì xuất T là số hoàn thiện Quay lại xuất T không là
số hoàn thiện
Bước 3: Trình bày lời giải
Var n, T, i: integer;
Begin
Write(‘Nhap n: ‘); readln(n);
T:=0;
Trang 3For i:=1 to n-1 do
If n mod i=0 then t:=t+1;
If T=n then write(n, ‘la so hoan thien’)
Else write(n,’khong la so hoan thien’);
Readln;
End
Bước 4: Xây dựng bộ test
N=6; N=12
c)
Bước 1: Input, Output
Bước 2: + Ý tưởng:
+ Thuật toán:
B1: Nhập n;
B2: Nếu sqrt(n)=round(sqrt(n)) thì xuất n là số chính phương Ngược lại xuất n không là số chính phương
Bước 3: Trình bày lời giải
Var n:integer;
Begin
Write(‘Nhap n:’); readln(n);
If sqrt(n) = round(sqrt(n)) then write(n,’la so chinh phuong’)
Else write(n,’khong la so chinh phuong’);
Readln;
End
Bước 4: N=4, N=10;
Câu: Viết chương trình con (hàm, thủ tục) tính bội số chung nhỏ nhất của 2 số nguyên a, b Hãy cho biết trong trường hợp này viết CTC dưới dạng hàm hay dưới dạng thủ tục là thuận tiện hơn? Vì sao?
Bước 1: Input: Cho a, b (a, b >0); Output: BCNN(a,b)
Bước 2: +Ý tưởng:
+ Thuật toán:
B1: Nhập a, b; Nếu a, b <0 thì quay lại B1
B2: m a; n b;
B3: Nếu n<>0 thì
Du m mod n;
M n;
N du; Quay lại B4
BCNN (a*b)/m;
B4: In kết quả và Kích tình Bước 3:
Var a, b, n:integer;
Function BCNN(a,b:integer):real;
Var m, n, du:integer;
Begin
M:=a;
N:=b;
While n<>0 do
Trang 4Du:=m mod n;
M:=n;
N:=du;
End;
Begin
Write(‘Nhap a:’); readln(a);
Write(‘Nhap b: ‘); readln(b);
Write(‘BCNN la:’,BCNN(a,b):10:2);
Readln;
End
Bước 4: TH1: a=1; b=3; TH2: a=6; b=9; TH3: a=6; b=7
Câu: lập phương trình để loại bỏ một phần tử ra khỏi mảng A gồm n phần tử cho trước( mỗi phần tử là một số nguyên)
a) Loại bỏ phần tử tại vị trí k
Bước 1: input: {an}, k
Output: dãy{an} sau khi xóa phần tử thứ k
Bước 2:
• ý tưởng: duyệt phần tử tại vị trí k và đẩy dần các phần tử vị trí sau lên,
vị trí a[k]=a[k+1]
• Thuật toán:
B1: nhập N, dãy A, vị trí k B2: Nếu k>N thì qua B5 B3: i<- k
B4: Nếu i<= N-1 then a[i]<- a[i+1];
i<- i+1;
Quay lại B4 N<- N-1, qua B6 B5: Xuất vị trí xóa vượt quá số phần tử
B6: Xuất dãy sau khi xóa, dừng TT Bước 3:
Var a: array[1 10] of integer;
n,i:integer;
Begin
Write(‘c’ho biet so phan tu cua day:’);
Readl(n);
For i:= 1 to n do
Begin
Write(‘Nhap a[=’,I,’]=’);
Readln(a[i]);
Writeln;
End;
Write(‘nhap vi tri loai bo:’);
Readln(k);
If k>n then write(‘vi tri xoa vuot qua ptu’)
Trang 5Else
Begin
For i:=k to n -1 do a[i]:= a[i+1]; n:=n-1;
Writeln(‘day sau khi xoa la:’); For i:=1 to n do write(a[i]:4); End;
Readln;
End
Bước 4: Xây dựng bộ kiểm thử
b) Loại bỏ phần tử có giá trị bằng x
Bước 1: input, output
Bước 2:
*Thuật toán:i
B1: Nhập n, dãy a, giá trị cần xóa x
B2: i<- 1
B3: Nếu i<= n thì
Nếu a[i]= x thì
Xóa phần tử a[i] tại vị trí
i<= 1
Ngược lại i<- i+1
Quay lại B3
B4: Xuất dãy đã xóa, kết thúc thuật toán
Bước 3:
Var a:array[1 10] of integer;
n, i, x, j: integer;
procedure xoa(n:integer);
var j:integer;
begin
if k:=n then write(‘vi tri xoa lon hon so ptu:’) else
begin
for i:=k to n-1 do a[j]:= a[j+1];
n:=n-1;
end;
end;
begin
write(‘cho biet so phan tu cua day:’);
readln(n);
for i:=1 to n do
begin
write(‘nhap a[=’,i,’]=’);
readln(a[i]);
writeln;
end;
Trang 6write(‘nhap vi tri can xoa:’);
readln(x);
j:= 1;
while j<=n do
begin
if a[j] = x then
begin
xoa(j);
j:=1;
end
else j:= j+1;
end;
writeln(‘day sau khi xoa:’);
for i:= 1 to n do write(a[i]:4);
readln;
end
Bước 4: Xây dựng bộ kiểm thử
Câu: Liệt kê tất cả các số chính phương nhỏ hơn 1 số n cho trước.
Bước 1: input, output
Bước 2:
*Ý tưởng:
*Thuật toán:
B1: nhập n
B2: Nếu n<0, quay lại B1
B3: i<- 1
B4: Nếu i>n, qua B5
Ngược lại:
Nếu sqrt(i)= round(sqrt(i)) thì in I;
i<- i+1;
B5: Kết thúc thuật toán
Bước 3:
Var n,i: integer;
Begin
Repeat
Write(‘nhap n:’);
Readln(n);
Until n>0;
For i:=1 to n-1 do
If sqrt(i)= round(sqrt(i)) then write(i);
Readln;
End
Bước 4: Bộ kiểm thử
Đưa ra 1 vài số n để kiểm tra
-TH1: n= 15
-TH2: n=26
-TH3: n:=30
Trang 7Câu: Xây dựng hàm kiểm tra một số n nguyên dương có phải là một số thuộc dãy Fibonacci hay không? Hàm trả về giá trị TRUE nếu n là số thuộc dãy Fibonacci, còn không hàm cho giá trị FALSE.
Bước 1: input, output
Bước 2:
*Ý tưởng:
*Thuật toán:
B1: nhập n
B2: kiemtra:= false; F1<- 1, F2<- 1, k<- 0;
B3: Nếu k<n thì k<- F1+F2
F1<- F2
F2<- k
Quay lại B3
B4: Nếu k<>n thì kiemtra<- F
Ngược lại kiemtra<- T
Bước 3:
Function kiemtra(n: integer): Boolean;
Var
Begin
F1:=0; F2:=0; k:=0;
While k<n do
Begin
K:=F1 + F2;
F1:= F2;
F2:= k;
End;
If k<> n then kiemtra:= False
Else kiemtra:=True;
End;
Bước 4: Xây dựng bộ kiểm thử
Câu: Hãy xđ một dãy cho trước có phải là dãy Fibonaci không?
Bước 1:
Input: dãy số
Output: dãy có thuộc dãy Fibonaci không?
Bước 2: ý tưởng
Kiểm tra phần tử đầu tiên có thuộc dãy Fibonaci không, nếu không thuộc thì dừng thuật toán và kết luận dãy không thuộc dãy Fibonaci Ngược lại, kiểm tra dãy theo tính chất F(n) = F(n-1) + F(n-2)
Thuật toán:
B1: nhập dãy
B2: F1=0, F2=1, K=0, i=2
B3: nếu K<a[1] thì:
K= F1+F2
F1=F2
F2=K
Trang 8Quay lại B3
B4: Nếu K <> a[1] thì dãy không thuộc Fibonaci, qua B7
B5: Nếu i<=n và a[i]=a[i-1] +F1 thì:
F1=a[i-1]
i=i+1 quay lại B5 B6: Nếu i>n thì dãy thuộc Fibonaci, ngược lại không thuộc
B7: Dừng thuật toán
Bước 3: chương trình
Var a: array[0 100] of integer;
n,k,F1,F2,i: integer;
begin
write(‘nhap phan tu cua day:’);
readln(n);
for i:= 1 to n do
begin
write(‘nhap phan tu’,i,’=’);
readln(a[i]);
end;
F1:=0; F2:=1; K:=0; i:=2;
While K<a[1] do
Begin
K= F1+F2 F1=F2 F2=K End;
If k=a[1] then
Begin
While(i<=n) and (a[i]=a[i-1]+F1) do
Begin
F1:= a[i-1];
i:=i+1;
end;
if (i>n) then write(‘day thuoc Fibonaci’) else
write(‘day khong thuoc Fibonaci’);
end else
write(‘day khong thuoc Fibonaci’);
readln;
end
Viết chương trình nhập vào một xâu S bất kì Thông báo lên màn hình xâu con tăng S1 của xâu S có độ dài lớn nhất, trong trường hợp 2 xâu bằng nhau lấy xâu trước
Giải
Bước 1:
Trang 9Input: xâu S Output: xâu con tăng Bước 2:
ý tưởng:
thuật toán:
B1: nhập vào xâu S
B2: khởi tạo: i=1; max=0; n=(độ dài xâu S)
B3: nếu i>n thì qua B6
B4: j=i
B5: nếu j<n và s[j+1] > s[j] thì:
J=j+1;
Quay lại B5 B6:
Nếu max <j-i+1 thì:
Max=j-i+1 Luu-i=i I=j+1
Quay len B3
B7: thông báo S1=copy(s,luu-I,max);
Dừng chương trình
Bước 3: Chương trình
Var s1,s2:string;
N, I, j, max, luu-i: integer;
Begin
Write(‘nhap chuoi:’);
Readln(s);
i:=1;
max:=0;
n:=length(s);
while i<=n do
begin
j:=I;
while (j<n) and (s[j+1]>s[j]) do j:=j+1;
if (max < j-i+1) then
begin
max:=j-i+1;
luu-i:=i;
end;
i:=j+1;
end;
s1:=copy(s,luu-i,max)
write(s1);
readln;
end
Bước 4: bộ kiểm thử, bộ test
Liệt kê các phần tử của dãy số thỏa mãn các tính chất:
Trang 10Là một số nguyên tố
Là một số hoàn thiện
Là một số chính phương
Giải
Bước 1:
Input:
Output:
Bước 2: ý tưởng
Thuật toán
B1: nhập n, dãy a;
B2: i=1;
B3: nếu i<=n thì
Nếu sqrt(a[i])=round(sqrt(a[i])) thì in a[i]; i=i+1;
quay lại B3 bước 3: Chương trình
var a: array[0 100] of integer;
i,n: integer;
begin
write(‘nhap n:’); readln(n);
write(‘nhap mang a’);
for i:=1 to n do
begin
write(‘a[‘,i,’]=’);
readln(a[i]);
end;
writeln(‘cac so chinh phuong trong day la’);
for i:= 1 to n do
if sqrt a[i] = round(sqrt(a[i])) then write(a[i]); readln;
end
Bước 4: xây dung bộ kiểm
Số hoàn thiện
Bước 1:
Input:
Output:
Bước 2:
Ý tưởng
Thuật toán
B1: nhập n, dãy a
B2: i=1
B3: nếu i>n thì quay xuống B5
B4: t=0; j=1;
Nếu j<=a[i]-1 thì
Trang 11Đề: Viết chương trình liệt kê các chữ số thỏa mãn điều kiện: Tổng các chữ số hàng trăm
và chữ số hàng bằng chữ số hàng đơn vị, chữ số hàng chục gấp đôi chữ số hàng nghìn Bước 1: input, output
Bước 2:
+ Ý tưởng:…
+ Thuật toán:
Bước 1: n1;t0;c0;dv0 Bước 2: Nếu (n+t= dv) và (c=n*2) thì in (1000*n+100*t+10*c+dv) Bước 3: Nếu dv<9 thì dv dv+1 Quay lại bước 2
Bước 4: Nếu c<9 thì cc+1; dv 0 Bước 5: Nếu t<9 thì t t+1; dv 0; c0 Bước 6: Nếu N<9 thì n n+1; dv0; c0;t0 Bước 7: KTTT
Bước 3: Chương trình
Var n, t, c, dv: integer;
Begin
n:=1; t:=0;c:=0; dv:=0;
for n:=1 to 9 do
for t:=9 to 9 do for c:=9 to 9 do
for dv:=9 to 9 do
if (n+t=dv) and (c=n*2) then write(n*100+t*100 +c*10 +dv);
readln;
end
Bước 4:
Bài: Tìm tất cả các số tự nhiên < 10000 mà tổng các ước của nó bằng chính nó
Bước 1: input, output
Bước 2:
+ Ý tưởng:…
+ Thuật toán:
Bước 1: i1; j0; s0;
Bước 2: Nếu i>10000 thì đến bước 6;
Bước 3: Nếu j>I div 2 thì chuyển đến bước 5 Bước 4: Nếu I mod j =0 thì
S S+j;
J j+1;
Quay lại bước 3;
Bước 5: NếuS=i thì in ra màn hình Bước 6: Nếu ii+1 quay lại bước 2 Bước 7: KTTT
Trang 12Bước 3: Chương trình
Var i, j, S: integer;
Begin
for i:=2 to 10000 do
begin
for j:=i div 2 to 9 do
if ( i mod j =0) then
S S+j;
end;
If S= i then write(i:5) readln;
End
Đề: Cho 2 dãy số nguyên A=(a1,a2,a3….,a), B=(b1,b2,b3….,bn), C=(c1, c2, c3,…., cn) được xđ như sau:
Ci =ak với i=2k-1,k=1, n
Bk với i=2k;k=1, n
Hãy lập trình:
a Nhập từ bàn phím số nguyên N(2<=N<=20), dãy số nguyên A, B
b Tạo và đưa ra màn hình dãy C
Bước 1: input, output
Bước 2:
+ Ý tưởng:…
+ Thuật toán:
Bước 1: Nhập N, 2 dãy {An}, {Bn}
Bước 2: i 1; k1;
Bước 3:+ Nếui<2*n thì
Nếu i=2*k-1 thì C[i]A[k]
Ngược lại thì:
C[i] B[k];
K k+1;
+ ii+1;
+ quay lại bước 3;
Bước 4: Xuất dãy C KTTT Bước 3: Chương trình
Var A, B, C:array[1 100] of integer;
n, k:integer;
Begin
Write(‘ Nhap n:’);
Readln(n);
for i:=1 to n do
Begin
Write(‘A Write(‘A[’, i, ‘]=’);
Readln(B[i]; [’, i, ‘]=’);
Readln(B[i];
Trang 13End;
k:=1;
for i:=1 to 2*n do
if i=2*k-1 then C[i]:=A[k]
else
begin C[i]:=B[k];
k:= k+1;
end;
for i:=1 to 2*n do
write(C[i]:5);
readln;
end
Đề: Cho dãy số nguyên P= (p1, p2,……,pn), 2<=n<=100 Biết rằng không phải mọi phần
tử của P đều bằng nhau Hãy :
a Khai báo các biến cần sử dụng
b Viết đoạn chương trình đổi chỗ hai phần tử lớn nhất và nhỏ nhất cho nhau Nếu có phần tử lớn nhất hoặc nhỏ nhất thì đổi chỗ phần tử lớn nhất có chỉ số với phần tử nhỏ nhất có chỉ số lớn nhất
Vd: p=(4, 3, 3, 4, 5, 6, 8, 6, 8)
N=9
P= (4, 3, 8, 4, 5, 6, 3, 6, 8)
Bước 1: input, output
Bước 2:
+ Ý tưởng:…
+ Thuật toán:
Bước 1: Nhập N, dãy P={p1, p2, ……,pn}
Bước 2: Kiểm tra (n<2) hoặc (n>10) thì nhập lại n, quay lại b1;
Ngược lại, nếu p1=p2=….pn Bước 3: minp[1]; maxp[1]; i1; k1; l1;
Bước 4:+ Nếu k<n thì
Nếu min>=p[i] thì
o Minp[i];
o k:=i;
Nếu max<p[i] thì
o Maxp[i]
o L:=i;
+ i i+1;
+ quay lại b4;
Bước 5: Hoán đổi 2 giá trị p[k] và p[l]
Bước 6: Xuất lại dãy P KTTT Bước 3: Chương trình
Trang 14Đề: Viết chương trình cho biết một số nguyên dương n có bao nhiêu chữ số.
Bước 1: input, output
Bước 2:
+ Ý tưởng:…
+ Thuật toán:
Bước 1: Nhập N Bước 2: dem 1; nn div 10;
Bước 3:+ Nếu n=0 chuyển sang
Ngược lại:
Dem dem +1;
N n div 10;
+ quay lại bước 3;
Bước 4: Xuất dem KTTT Bước 3: Chương trình
Var dem, n:integer;
Begin
Write(‘ Nhap n:’);
Readln(n);
dem:=1;
n:= n div;
if n=0 then write(‘so n co’, dem, ‘chu so’);
while n<>0
begin
dem:=dem+1;
n:= n+1;
end;
write(‘so n co’, dem, ‘chu so’);
readln;
end
Đề: Viết chương trình liệt kê các chữ số có ba chữ số: Tổng các chữ số của nó bằng một
số a và tích các chữ số b (a, b la số cho trước)
Bước 1: input, output
Bước 2:
+ Ý tưởng:…
+ Thuật toán:
Bước 1: Nhập a, b;
Bước 2: t1; c0, dv0;
Bước 3: Nếu (t+c+dv=a) và (t*c*dv=b) thì in ra t*100+c*10+dv Bước 4: Nếu dv<9 thì dvdv+1 Quay lại b3
Bước 5: Nếu c<9 thì cc+1;
dvdv+1 quay lại b3 Bước 6: Nếu t<9 thì tt+1;
C0; dv0 quay lại b3 Bước 7: KTTT
Trang 15Bước 3: Chương trình
Var n, t, c, dv, a, b: integer;
Begin
Write(‘nhap a, b’);
Readln(a,b);
t:=1; c:=0; dv:=0;
for t:=1 to 9 do
for c:=9 to 9 do for dv:=9 to 9 do
if (t+c+dv=a) and (t*c*dv) then
write(t*100+c*10 +dv); readln;
end
Đề: Viết chương trình tính n! bằng phương pháp khử đệ quy
Ý tưởng:
Thuật toán:
Bước 1: Nhập n
Bước 2: i 1, t 1
Bước 3: Nếu (n=0) thì thông báo giai thừa =0
Bước 4: Nếu i<n thì t t*i
i i+1 quay lại bước 4
Bước 5: thông báo kết quả n!=t
Dừng tt
Chương trình:
Function gthua(n:integer):longint;
Var i:integer; t:longint;
Begin
If (n=0) then gthua:=0
Else begin
T:=1;
For i:=1 to n do t:=t*I;
End;
Gthua:=t;
End;
Đề: Tìm bội chung nhỏ nhất của một dãy số
Ý tưởng:
Thuật toán:
Bước 1: Nhập dãy a có n phần tử
Bước 2: Nếu n=1 thì BCNN là a[n], KTTT
Bước 3: i1
Bươc 4: Nếu i<n thì e=max(a[i],a[i-1])
d=e, qua bước 5
Ngược lại BCNN của dãy là e, KTTT
Bước 5: Nếu (e mod a[i]=0) and (e mod a[i+1]=0) thì
Trang 16a[i+1]=e i=i+1, quay lại bước 4
Ngược lại e=e+d, quay lại bước 5
Chương trình:
Var a:array[1 100] of integer;
Begin
Write(‘nhap n:’); readln(n);
For i:=1 to n do
Begin
Write(‘a[‘,i,’]=’); readln(a[i]);
End;
If n=1 then write(‘BCNN la:’,a[n]);
Else
For i:=1 to n-1 do
Begin
If a[i] > a[i+1] then e:=a[i]
Else e:=a[i+1];
While (e mod a[i] <>0) or (e mod a[i+1] <>0) do Begin
E:=e+d;
A[i+1]:=e;
End;
Write(‘BCNN cua day la:’,e);
End
Đề: Liệt kê tất cả các dãy nhị phân có độ dài n (không đệ quy)
Ý tưởng:
Thuật toán:
Bước 1: nhập n
Bước 2: khởi tạo (a[1],a[2],…,a[n]=0), in cấu hình khởi tạo, in Bước 3: Nếu i>=1 thì
Nếu a[i]=0 thì -a[i]=1 -in dãy a ra màn hình -in
Ngược lại -a[i]=0 -ii-1 Bước 4: KTTT
Chương trình:
program np;
var a:array[1 50] of integer;
i,n,j,t:integer;
begin
write('nhap n:'); readln(n);
for i:=1 to n do