Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

In 1 đến 1000 không dùng vòng lặp hay điều kiện trong C/C++

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

  1. static int value = 1: Biến đếm chung, khởi tạo = 1
  2. PrintN obj[N]: Tạo mảng N đối tượng → Constructor chạy N lần
  3. Mỗi lần constructor chạy: in value rồi ++value
  4. 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ápLoop?If?Ghi chú
Static member + ArrayKhôngKhôngĐáp ứng đề bài chính xác
Template recursionKhông (compile-time)KhôngCode bloat, limit template depth
Recursion + &&Không (recursion)Có (short-circuit)Vi phạm "không điều kiện"
std::iota + copyCó (trong thư viện)KhôngThự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)