Hướng dẫn giải của Tìm giá trị tuyệt đối
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Lời giải này đang bị ẩn cho đến khi bạn chọn mở ra.
Chúng tôi khuyên bạn nên tự thử giải bài trước. Việc mở lời giải có thể làm lộ mất ý tưởng chính trước khi bạn có cơ hội tự giải.
Bạn phải đăng nhập để mở lời giải này.
Đăng nhậpTác giả: , , ,
Hiểu bài toán
Bài toán yêu cầu tính giá trị tuyệt đối của hiệu giữa hai số nguyên a và b. Nói cách khác, cần tính |a - b|. Với hai số nguyên a, b có thể dương hoặc âm, ta cần tìm kết quả là một số không âm sao cho hiệu của a và b có giá trị bằng kết quả đó (hoặc ngược lại). Ví dụ, |5 - 3| = 2, |-5 - 3| = 8. Dữ liệu đầu vào có thể lên tới 10^6, nhưng phép tính hiệu sẽ nằm trong khoảng [-210^6, 210^6], hoàn toàn nằm trong giới hạn của số nguyên 32-bit.
Các cách tiếp cận
Cách Sử dụng hàm abs()
#include <stdio.h>
#include <math.h>
#define ll long long
int main(){
int a,b;
scanf ("%d %d",&a,&b);
int c=abs(a-b);
printf ("%d",c);
return 0;
}
- Time Complexity: O(1)
- Space Complexity: O(1)
Đây là cách tiếp cận trực quan và ngắn gọn nhất. Ta sử dụng hàm abs() có sẵn trong thư viện math.h (hoặc stdlib.h) để tính giá trị tuyệt đối của một số. Ta chỉ cần nhập hai số a, b, tính hiệu a - b, và truyền kết quả này vào hàm abs() để có được giá trị tuyệt đối. Hàm abs() thường được tối ưu hóa ở mức biên dịch và chạy rất nhanh.
Cách Sử dụng câu lệnh điều kiện (if-else)
#include <stdio.h>
int main(){
int a,b;
scanf("%d %d",&a ,&b);
if(a>=b) printf("%d", a - b);
else printf("%d", b - a);
return 0;
}
- Time Complexity: O(1)
- Space Complexity: O(1)
Cách này dựa trên định nghĩa toán học của giá trị tuyệt đối. Nếu a >= b thì a - b là một số không âm, chính là giá trị tuyệt đối của hiệu. Ngược lại (a < b), ta cần tính b - a để có giá trị không âm. Phương pháp này không cần thư viện bên ngoài, chỉ sử dụng cấu trúc rẽ nhánh cơ bản của ngôn ngữ lập trình.
Phân tích độ phức tạp
| Cách tiếp cận | Time | Space | Tên |
|---|---|---|---|
| 1 | O(1) | O(1) | Sử dụng hàm abs() |
| 2 | O(1) | O(1) | Sử dụng câu lệnh điều kiện (if-else) |
Bài học kinh nghiệm
- Bài toán có thể được giải quyết bằng cách sử dụng hàm có sẵn (abs) hoặc bằng logic điều kiện (if-else) dựa trên việc so sánh hai số.
- Vì giới hạn dữ liệu nhỏ nên không cần quan tâm đến việc tràn số nguyên khi tính hiệu (int 32-bit chứa được số nguyên từ -210^9 đến 210^9).
Lỗi thường gặp
- Quên khai báo thư viện cần thiết (math.h hoặc stdlib.h cho hàm abs).
- Nhập sai định dạng input (ví dụ: thiếu dấu cách giữa hai số).
Bình luận
hê
n = abs(int(input()))
if n == 0: print("INF") else: divs = set() for i in range(1, int(n**0.5) + 1): if n % i == 0: divs.add(i) # Thêm ước nhỏ divs.add(n // i) # Thêm ước lớn tương ứng