2
已解决
薛乘志
初级启示者
初级启示者
暴力统计质数,但是用的是模板元编程(原创)
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
//质数**器
template <ll x, ll i, bool end> struct check;
template <ll x, ll i> struct check<x, i, true> {
static const bool value = check < x, i - 1, x % i != 0 >::value;
};
template <ll x, ll i> struct check<x, i, false> {
static const bool value = false;
};
template <ll x> struct check<x, 2, true> {
static const bool value = x == 2 || x % 2 != 0;
};
template <ll x> struct check<x, 1, true> {
static const bool value = true;
};
//质数枚举器
template <ll i> struct prime;
template <ll i> struct prime {
static const ll value = prime < i - 1 >::value + check < i, i - 1, true >::value;
};
template <> struct prime<2> {
static const ll value = 1;
};
//质数统计器
ll cnt[1000005];
template <ll i> struct init;
template <ll i> struct init {
init() {
cnt[i] = prime<i>::value;
init < i - 1 > ();
}
};
template <> struct init<2> {
init() {
cnt[2] = prime<2>::value;
}
};
int main() {
init<900>();
for (int i = 2; i <= 900; i++) {
cout << i << ":" << cnt[i] << endl;
}
return 0;
}
这里设的数字是900(因为编译器再大一些就直接报错说超出最大嵌套范围),然后循环输出2~i的质数个数
这些数字是编译器暴力计算的,所以编译非常慢(我家电脑17.02s)(新的卡测评机方法诞生了)