[Lý Thuyết Số - Toán Học]. Bài 11. Ước số nguyên tố nhỏ nhất

Xem dạng PDF

Gửi bài giải

Điểm: 1,00 (OI)
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 256M
Input: stdin
Output: stdout

Nguồn bài:
28Tech
Dạng bài
Ngôn ngữ cho phép
C, C#, C++, Java, Kotlin, Pascal, PyPy, Python, Scratch

Cho số tự nhiên N. Nhiệm vụ của bạn là in ra ước số nguyên tố nhỏ nhất của các số từ 1 đến N.

Ước số nguyên tố nhỏ nhất của 1 là 1. Ước số nguyên tố nhỏ nhất của các số chẵn là 2. Ước số nguyên tố nhỏ nhất của các số nguyên tố là chính nó.

Gợi ý : Đối với số N duyệt từ 2 tới √N nếu gặp số mà N chia hết => Đây chính là ước nguyên tố nhỏ nhất, còn nếu không gặp thì N là số nguyên tố nên bạn return N


Đầu vào

Dòng duy nhất chứa số nguyên dương N


Giới hạn

1≤N≤100000


Đầu ra

Đưa ra kết quả theo từng dòng


Ví dụ :

Input 01
6
Output 01
1
2
3
2
5
2

Bình luận

Hãy đọc nội quy trước khi bình luận.



  • 0
    bengokyeuanh99  đã bình luận lúc 13, Tháng 4, 2025, 6:57

    include <iostream>

    include <vector>

    include <stdexcept>

    using i32 = int; using vi32 = std::vector<i32>;

    class PrimeFactorSolver { public: explicit PrimeFactorSolver(i32 upperbound) : n(upperbound) { if (n < 1 || n > 100000) throw std::invalid_argument("N must be in range [1, 100000]"); spf.assign(n + 1, 0); }

    const vi32& compute() {
        spf[1] = 1;
        for (i32 i = 2; i <= n; ++i) {
            if (spf[i] == 0) {
                spf[i] = i;
                for (i32 j = i * 2; j <= n; j += i)
                    if (spf[j] == 0)
                        spf[j] = i;
            }
        }
        return spf;
    }
    
    void print_result(std::ostream& out = std::cout) const {
        for (i32 i = 1; i <= n; ++i)
            out << spf[i] << '\n';
    }
    

    private: i32 n; vi32 spf; };

    i32 main() { std::ios::syncwithstdio(false); std::cin.tie(nullptr);

    i32 n;
    if (!(std::cin >> n)) {
        std::cerr << "Invalid input\n";
        return 1;
    }
    
    try {
        PrimeFactorSolver solver(n);
        solver.compute();
        solver.print_result();
    } catch (const std::exception& e) {
        std::cerr << e.what() << '\n';
        return 1;
    }
    
    return 0;
    

    }