Hướng dẫn giải của In ra các số từ a đến b
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 in ra tất cả các số nguyên trong khoảng từ a đến b theo thứ tự tăng dần, phân tách bởi dấu cách. Đầu vào là hai số nguyên a và b, với -1000 ≤ a ≤ b ≤ 1000. Mặc dù đề bài cho ràng buộc a ≤ b, một số giải pháp vẫn xử lý trường hợp a > b để đảm bảo tính an toàn.
Các cách tiếp cận
Cách Vòng lặp cơ bản
#include <stdio.h>
int main() {
int a, b;
scanf("%d %d", &a, &b);
for (int i = a; i <= b; i++) {
printf("%d ", i);
}
return 0;
}
- Time Complexity: O(n)
- Space Complexity: O(1)
Đây là cách tiếp cận trực quan nhất. Ta sử dụng một vòng lặp for để duyệt từ a đến b (bao gồm cả hai đầu). Biến vòng lặp i khởi tạo bằng a, sau đó tăng dần cho đến khi bằng b. Trong mỗi lần lặp, ta in giá trị của i ra màn hình cùng với một dấu cách. Do ràng buộc của đề bài là a ≤ b, vòng lặp này sẽ chạy đúng số lần cần thiết.
Cách Xử lý linh hoạt
#include<stdio.h>
int main() {
int a, b;
scanf("%d %d", &a, &b);
if(a <= b) {
for (int i = a; i <= b; i++) {
printf("%d ", i);
}
} else {
for (int i = a; i >= b; i--) {
printf("%d ", i);
}
}
return 0;
}
- Time Complexity: O(n)
- Space Complexity: O(1)
Giải pháp này cung cấp sự linh hoạt bằng cách kiểm tra xem a có nhỏ hơn hoặc bằng b không. Nếu đúng, nó thực hiện vòng lặp tăng dần (từ a đến b). Nếu sai (tức là a > b), nó thực hiện vòng lặp giảm dần (từ a xuống b). Mặc dù đề bài đảm bảo a ≤ b, cách tiếp cận này giúp code trở nên 'mạnh mẽ' hơn và tự động xử lý được cả trường hợp đầu vào không đúng quy tắc.
Cách Tối ưu hóa in đậm
#include <stdio.h>
int main()
{
int a, b;
scanf("%d %d", &a, &b);
if(a >= -1000 && a<=1000 && b <= 1000 && b >= a)
{
for(int i = a; i <= b; i++)
{
printf("%d %c", i, ' ');
}
}
return 0;
}
- Time Complexity: O(n)
- Space Complexity: O(1)
Giải pháp này thực hiện tương tự như cách đầu tiên nhưng có thêm bước kiểm tra điều kiện ràng buộc của đề bài (-1000 ≤ a ≤ b ≤ 1000) ngay trong if. Nếu điều kiện thỏa mãn, vòng lặp sẽ thực hiện. Đây là một cách tiếp cận an toàn, đảm bảo rằng chương trình chỉ chạy khi dữ liệu đầu vào nằm trong giới hạn cho phép. Việc in ra "%d %c", i, ' ' cũng là một kỹ thuật để đảm bảo có một dấu cách ở sau mỗi số.
Phân tích độ phức tạp
| Cách tiếp cận | Time | Space | Tên |
|---|---|---|---|
| 1 | O(n) | O(1) | Vòng lặp cơ bản |
| 2 | O(n) | O(1) | Xử lý linh hoạt |
| 3 | O(n) | O(1) | Tối ưu hóa in đậm |
Bài học kinh nghiệm
- Vòng lặp
forlà công cụ phù hợp nhất để duyệt qua một dải số liên tiếp. - Kiểm tra điều kiện
a <= blà cần thiết nếu muốn code hoạt động ngay cả khia > b(dù đề bài không yêu cầu). - Ràng buộc đề bài rất nhỏ (chỉ 1000), nên mọi cách tiếp cận đều chạy gần như tức thời.
Lỗi thường gặp
- Bỏ sót số cuối cùng: Vòng lặp phải là
i <= bchứ không phảii < b. - Thiếu dấu cách ở cuối: In
printf("%d ", i)sẽ tự động thêm dấu cách sau mỗi số, giúp định dạng đúng yêu cầu.
Bình luận