C ++是否有任何内置函数来检查数字是否为素数。如果是,那么在哪个库?
以下是我的实施。但只是看看是否有任何内置功能。在Google上搜索只会提供基于用户的实现。
int isprime(int N){
if(N<2 || (!(N&1) && N!=2))
return 0;
for(int i=3; i*i<=N; i+=2){
if(!(N%i))
return 0;
}
return 1;
}
答案 0 :(得分:7)
不,没有内置函数可以检查素数。
您发布的解决方案可以改进:如果您只计算一次i*i
的平方根,则可以避免N
。
如果您知道要检查的号码范围,可以使用筛子和地图,而不是重复计算 - http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes
答案 1 :(得分:6)
简短回答:不,没有这样的功能。
标准中使用“prime”一词的唯一时间是26.5.3.2中的脚注,这是描述mersenne_twister_engine
类模板的地方。脚注说:
274)该引擎的名称部分是指其期间的属性:对于正确选择的参数值,该期间与大的梅森素数密切相关。
如果存在这样的函数,标准将包含更多出现的单词,因为它会用它来描述该函数的行为。
答案 2 :(得分:2)
没有C ++“内置”功能,但你可以使用元编程来解决这个问题。
template <int i>
struct D
{
D(void *);
operator int();
};
template <int p, int i>
struct is_prime
{
enum { prim = (p%i) && is_prime<(i>2?p:0), i>::prim };
};
template <int i>
struct Prime_print
{
Prime_print<i-1> a;
enum { prim = is_prime<i,i-1>::prim };
void f() { D<i> d = prim; }
};
struct is_prime<0,0> { enum { prim = 1 }; };
struct is_prime<0,1> { enum { prim = 1 }; };
struct Prime_print<2>
{
enum { prim = 1 };
void f() { D<2> d = prim; }
};
void foo()
{
Prime_print<10> a;
}
希望有所帮助
答案 3 :(得分:1)
广泛使用的GMP库具有快速的概率素数测试功能,请参阅https://gmplib.org/manual/Number-Theoretic-Functions.html
只需转换整数,示例代码:
bool is_prob_prime(long l)
{
mpz_t bigint;
mpz_init_set_si(bigint, l);
bool ret = mpz_probab_prime_p(bigint, 25) > 0;
mpz_clear(bigint);
return ret;
}
答案 4 :(得分:0)
template <size_t upper_limit> class prime_table final {
public:
static_assert(upper_limit >= 2, "upper_limit too tiny");
prime_table() {
table_.set();
table_.reset(0);
table_.reset(1);
size_t root = size_t(std::sqrt(upper_limit)) + 1;
for (size_t pos = 2; pos <= root; ++pos) {
for (size_t multiplier = 2; pos * multiplier <= upper_limit;
++multiplier) {
table_.reset(pos * multiplier);
}
}
}
inline bool is_prime(size_t value) { return table_.test(value); }
protected:
std::bitset<upper_limit + 1> table_;
};
它将生成一个质数表,然后您可以使用is_prime()对范围为[0,upper_limit]的数字进行测试