Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 4

Câu 1

Tinh chế lần 1

Xác định số n có phải là hoàn hảo không

Duyệt từ 1 đến n -1 để tìm các ước của n

Nếu tổng các ước bằng n thì đó là số hoàn hảo

Tinh chế lần 2

Tìm tất cả các số hoàn hảo trong mảng

Lặp qua từng phần tử trong mảng

Đối với mỗi phần tử kiểm tra xem có phải là số hoàn hảo không

Nếu là số hoàn hảo thì lưu trữ nó

Tinh chế lần 3

Tìm số lớn nhất trong các số hoàn hảo

Cài đặt

int findMax(int arr[], int n) {

int max = arr[0];

for (int i = 1; i < n; i++) {

if (arr[i] > max) {

max = arr[i];

return max;

int main() {

int arr[] = {5, 3, 9, 12, 7, 2};

int n = sizeof(arr) / sizeof(arr[0]);


int maxNumber = findMax(arr, n);

printf("Số lớn nhất trong mảng là: %d\n", maxNumber);

return 0;

Câu 2
Bài 2. Kiểm tra mảng a có n số nguyên có phải là một đoạn con của mảng b có m số nguyên không?

Tinh chế lần 1:


Nếu mảng a[] là con của b[] thì mọi phần tử trong mảng a[] phải có trong mảng b[] và phải cùng thứ tự. Ý
tưởng lấy từng phần tử đầu tiên mảng a so sánh với từng phần tử của mảng b
Chi tiết chức năng so sánh các phần tử giữa a[] và b[] và xác định xem a[] có phải con b[] hay không:
Giải thích: để biết a[] được duyệt hết hay chưa, ta đếm số lần mỗi khi hai phần tử của hai mảng bằng
nhau . Nếu số lần bằng với số phần tử mảng a (n) thì a[] con b[] và ngược lại

Tinh chế lần 2:


Chi tiết chức năng kiểm tra a[] có phải con b hay không
Dùng đệ quy để giảm bớt độ phức tạp thuật toán
nếu a[n-1] = b[m-1]
return CheckCon(a,b,n-1, m-1)
Ngược lại return CheckCon(a, b, n, m-1)

Cài đặt:
Bool CheckCon(a[],b[],n,m)
If (n = 0) return True
Else if(m = 0) return False
Else
If(a[n-1] = b[m - 1])
return SauCon(a,b,n-1,m-1)
Else
return SauCon(a,b,n,m-1)
End if
End if
End function

Câu 3
Tinh chế lần 1
Chi tiết chức năng hàm kiểm tra một số có tồn tại trong mảng b hay không
Duyệt từng phần tử trong mảng b[], nếu số x tồn tại trong mảng b[] thì trả về False, ngược lại là True
Tinh chế lần 2
Chi tiết chức năng tạo mảng động b. Mảng động là mảng khi thêm và bớt các phần tử thì nó sẽ tự
động thêm hoặc thu hồi vùng nhớ. Độ dài mảng động là <tên mảng>.size() Vector <int> b
Tinh chế lần 3:
kiểm tra từng phần tử mảng a có tồn tại trong mảng b hay không, nếu không thì
thêm phần tử a[i] vào mảng b

Cài đặt
bool KTraTonTai(vector <int> a , int x)
for (int i = 0; i < a.size(); i++)
if(a[i] == x) return false;
End if
End for
return true;
End Function
// ham main
vector <int> b
for (int i = 0; i < n; i++)
if(KTraTonTai(b,a[i]))
b.push_back(a[i]);
End if
End for
print(b);
End function
II. Đánh giá độ phức tạp của các thuật toán Bài 4. Kiểm tra mảng đối xứng?
Thuật toán:
bool KTDoiXung(a[],n)
for (int i = 0; i < n/2; i++)
if(a[i] != a[n-1-i])
return false;
End if
End for
return true;
End function
ộ phức tạp: O(n) = n/2
Bài 5. Kiểm tra một số nguyên dương là số nguyên tố không?
Bool CheckPrime(n)
For(int i = 2; i <= sqrt(n); i++)
if(n%i == 0) return False
End if
End for
Return True
End function
Độ phức tạp: 0(n)= √𝑛
Bài 6. Liệt kê các số hoàn thiện nhỏ hơn hoặc bằng n. Thuật toán:
4651050044 – Nguyễn Khánh Dương
bool CheckPerfectNumber(int n)
int sum = 0;
for (int i = 1; i < n; i++)
if(n%i == 0)
sum+= i;
End if
End for
if(sum == n) return true;
End if
return false;
End function
// ham main
for (int i = 1; i <= n; i++)
if(CheckPerfectNumber(i))
cout << i << ' ';
End if
End for
Độ phức tạp: O(n) = n(n-1)
Bài 7. Tìm 2 số của mảng tổng bằng S. Thuật toán:
void sum_is_s(int a[], int n, int s)
for (int i = 0; i < n; ++i) {
for (int j = i+1; j < n; ++j) {
if(a[i] + a[j] == s)
cout << a[i] <<" va " << a[j] << endl;
End if
End for
End for
End function
Độ phức tạp O(n) = n2
Bài 8. Liệt kê dãy nhị phân chiều dài n.
Function dayNhiPhan(i, n, a[])
for j = 0 to 1:
a[i] = j
if i = n-1:
print(a)
else:
dayNhiPhan(i+1, n, a)
end if
end for
End function
Độ phức tạp: O(n) = n

You might also like