问题标题: 暴力统计质数

2
1
已解决
薛乘志
薛乘志
初级启示者
初级启示者

暴力统计质数,但是用的是模板元编程(原创)

#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)(新的卡测评机方法诞生了)


0
0
0
我要回答