Bài toán: In số 1 đến 1000 không dùng vòng lặp (for/while/do-while) và không dùng câu lệnh điều kiện (if/switch/?:).
Giải pháp: Static member + Constructor + Array
Tận dụng việc constructor được gọi khi tạo mảng đối tượng.
#include <iostream>
class PrintN {
public:
static int value; // Static member: chia sẻ cho tất cả instance
PrintN() {
std::cout << value++ << ", ";
}
};
// Định nghĩa static member
int PrintN::value = 1;
int main() {
const int N = 1000;
PrintN obj[N]; // Tạo mảng 1000 đối tượng -> Constructor gọi 1000 lần
}
Kết quả
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ... 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000,
Giải thích
static int value = 1: Biến đếm chung, khởi tạo = 1PrintN obj[N]: Tạo mảng N đối tượng → Constructor chạy N lần- Mỗi lần constructor chạy: in
valuerồi++value - Không dùng loop, không dùng if
Các giải pháp khác (tham khảo)
1. Template Metaprogramming (Compile-time)
template <int N>
struct Print {
static void f() {
Print<N-1>::f();
std::cout << N << ", ";
}
};
template <>
struct Print<1> {
static void f() { std::cout << "1, "; }
};
int main() {
Print<1000>::f(); // In 1..1000 tại compile-time
}
2. Recursion với short-circuit (có điều kiện ẩn)
void print(int n) {
n && (print(n-1), std::cout << n << ", ");
// n && ... : nếu n==0 thì dừng (short-circuit) - VỪA DÙNG ĐIỀU KIỆN ẨN
}
3. std::iota + algorithm (C++11, có loop ẩn)
#include <iostream>
#include <vector>
#include <numeric>
#include <algorithm>
#include <iterator>
int main() {
std::vector<int> v(1000);
std::iota(v.begin(), v.end(), 1); // Fill 1..1000
std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, ", "));
}
So sánh
| Phương pháp | Loop? | If? | Ghi chú |
|---|---|---|---|
| Static member + Array | Không | Không | Đáp ứng đề bài chính xác |
| Template recursion | Không (compile-time) | Không | Code bloat, limit template depth |
| Recursion + && | Không (recursion) | Có (short-circuit) | Vi phạm "không điều kiện" |
| std::iota + copy | Có (trong thư viện) | Không | Thực tế nhất |
Lưu ý
- Cách mảng đối tượng dùng stack memory: N=1000 OK, N=1,000,000 có thể stack overflow
- Static member phải định nghĩa bên ngoài class
- Thứ tự in: 1, 2, 3... (constructor chạy theo thứ tự mảng)