美文网首页
poj3292 素数打表

poj3292 素数打表

作者: 暖昼氤氲 | 来源:发表于2019-12-07 16:58 被阅读0次

正确版

/*
Time:2019.12.7
Author: Goven
type:素数打表
ref:https://blog.csdn.net/lyy289065406/article/details/6648537
*/
#include<iostream>
#include<cstring>
#define MAXH 1000005
using namespace std;

int H_prime[MAXH], res[MAXH];
int cnt;

void primeTable(){
    cnt = 0;
    H_prime[cnt++] = 5;
    for (int i = 5; i < MAXH; i += 4) {
        int flag = 1;
        for (int j = 0; H_prime[j] * H_prime[j] <= i; j++) {
            if (i % H_prime[j] == 0) {
                flag = 0; break;
            }
        }
        if (flag) H_prime[cnt++] = i;
    }   
}

void getH_semi_primes() {
    for (int i = 0; i < cnt; i++) {
        for (int j = 0; j < cnt; j++) {
            if (MAXH / H_prime[i] < H_prime[j]) break;
            res[H_prime[i] * H_prime[j]] = 1;
        }
    }
    
    for (int i = 1; i < MAXH; i++) {
        res[i] += res[i - 1];
    }
}

int main()
{
    primeTable();
    getH_semi_primes();
    int h;
    while (cin >> h && h) {
        cout << h << " " << res[h] << endl;
    }
    return 0;
}

错误版-超时:

/*
Time:2019.12.7
Author: Goven
type:素数打表 
ref:
err:Time Limit Exceeded
*/
#include<iostream>
#include<cstring>
#define MAXH 1000005
using namespace std;

bool isH_prime[MAXH];
int H_prime[MAXH];
int cnt;

void primeTable(){
    memset(isH_prime, false, sizeof(isH_prime));
    int flag;
    cnt = 0;
    H_prime[cnt++] = 5;
    isH_prime[5] = true;
    for (int i = 5; i < MAXH; i += 4) {
        flag = 1;
        for (int j = 0; H_prime[j] * H_prime[j] <= i; j++) {
            if (i % H_prime[j] == 0) {
                flag = 0; break;
            }
        }
        if (flag) H_prime[cnt++] = i, isH_prime[i] = true;
    }   
}

int main()
{
    primeTable();
    int h;
    while (cin >> h && h) {
        int res = 0;
        for (int i = 5; i <= h; i += 4) {
            for (int j = 0; j < cnt; j++) {
                if (i % H_prime[j] == 0 && (i / H_prime[j] % 4 == 1) && isH_prime[i / H_prime[j]]) {
                    res++;
                    break;
                }
            }
        }
        cout << h << " " << res << endl;
    }
    return 0;
}

相关文章

  • poj3292 素数打表

    正确版 错误版-超时:

  • 素数打表

  • Chapter14—数学—数论

    1. 题目列表 POJ2635(高精度求模:同余模运算、Java大数) POJ3292(数筛 + 和的打表:树状数...

  • hw4 注意事项 2021-03-26

    计算素数的题目不要打表(去网上抄1000以内的素数表),打表没有成绩,但是现实中是一种解决问题的办法。 打印乘法表...

  • (ACM)美素数(打表)

    一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为“美素数”,如29,本身是素数,而且2+9 = 11...

  • 素数练习题

    UVA 10375 UVA 10791 UVA10375 Choose and divide 题解 先素数打表,然...

  • poj2739 素数 + 打表 + 尺取法

  • 数论模版

    参考我的博客代码github 数论 最大公约数(GCD)/最小公倍数(LCM) 素数判断及打表 快速幂/乘取模 拓...

  • 天花板编程手把手计划-第1期-第0天-打卡

    题目 编程实现如下功能:依次打印出1~100,遇到素数折行。效果如下: 解题思路 打印1~100的数字,遇见素数打...

  • 打表

    打表 给定一个十进制的正整数(1<=n<=10000),写下从1到n的所有整数,然后数一下其中出现的数字“1”的个...

网友评论

      本文标题:poj3292 素数打表

      本文链接:https://www.haomeiwen.com/subject/zjvugctx.html