c++ 如何直接计算一系列数字并将它们存储到constexpr变量中,而不需要在编译时先计算它们的大小?

rdlzhqv9  于 2023-01-22  发布在  其他
关注(0)|答案(1)|浏览(84)

有没有办法避免get_primes_size?现在计算小于1000的素数的过程重复两次。
比如先把它们推到本地std::vector,然后再把它变成std::array

constexpr bool is_prime(int n)
{
    for (int i = 2; i * i < n; i++)
    {
        if (n % i == 0)
        {
            return false;
        }
    }
    return true;
}

template <int upper_limit>
consteval int get_primes_size()
{
    int size = 0;
    for(int i = 2; i <= upper_limit; i++) {
        if (is_prime(i)) {
            size++;
        }
    }
    return size;
}

template <int upper_limit>
consteval auto get_primes()
{
    int count = 0;
    array<int, get_primes_size<upper_limit>()> primes;
    for(int i = 2; i <= upper_limit; i++) {
        if(is_prime(i)) {
            primes[count++] = i;
        }
    }
    return primes;
}

constexpr auto primes = get_primes<1000>();

int main()
{
    cout << "Hello World" << endl;
}
wn9m85ua

wn9m85ua1#

虽然不是最优的,但因为肯定有少于n/2个素数小于n,所以你可以:
array<int, upper_limit/2> primes;
那么在循环中,你会像在get_prime_size中一样,计算你遇到的素数的个数,并返回截断的数组。

相关问题