有没有办法避免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;
}
1条答案
按热度按时间wn9m85ua1#
虽然不是最优的,但因为肯定有少于n/2个素数小于n,所以你可以:
array<int, upper_limit/2> primes;
那么在循环中,你会像在
get_prime_size
中一样,计算你遇到的素数的个数,并返回截断的数组。