判断一个正整数是否为质数
#include <iostream>
#include <cmath>
bool is_prime(uint64_t n)
{
if (n == 0 or n == 1)
return false;
if (n == 2 or n == 3)
return true;
if (n % 6 != 1 and n % 6 != 5)
return false;
auto n_sqrt = static_cast<uint64_t>(std::sqrt(n));
for (uint64_t i = 5; i <= n_sqrt; i += 6) {
if (n % i == 0 or n % (i + 2) == 0)
return false;
}
return true;
}
int main()
{
uint32_t cnt = 0;
for (uint64_t i = 0; i < 1000; i++) {
if (is_prime(i)) {
cnt++;
std::cout << i << ' ';
}
}
std::cout << "\ncnt = " << cnt << std::endl;
}
获取前 n 个质数(使用 C++20 ranges 库)
#include <iostream>
#include <ranges>
#include <cmath>
#include <cstdlib>
bool is_prime(uint64_t n);
int main(int argc, char* argv[])
{
auto prime_amount = 100; // 欲获取的质数个数,默认 100 个
if (argc == 2)
prime_amount = std::atoi(argv[1]);
auto get_prime = [](int n) {
return std::views::iota(0) | std::views::filter(is_prime) | std::views::take(n);
};
auto i = 0;
for (auto prime : get_prime(prime_amount))
{
if (i % 10 == 0 and i != 0)
std::cout << '\n';
std::cout << prime << '\t';
++i;
}
std::cout << std::endl;
}
bool is_prime(uint64_t n)
{
if (n == 0 or n == 1)
return false;
if (n == 2 or n == 3)
return true;
if (n % 6 != 1 and n % 6 != 5)
return false;
auto n_sqrt = static_cast<uint64_t>(std::sqrt(n));
for (uint64_t i = 5; i <= n_sqrt; i += 6) {
if (n % i == 0 or n % (i + 2) == 0)
return false;
}
return true;
}