密码工程-小素数

0. 在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务
1. 参考《密码工程》p107伪代码基于Eratosthenes算法实现 int SmallPrimeList(int n, int *plist, int *len), 其中plist返回素数列表,len返回列表长度(10
’)
2 写出测试代码,至少包括 n=2, n=你的四位学号,n>2^20次方的测试代码,提交代码和运行结果截图(5)
 
输入2

 

 

输入学号后四位1220

 

求得最大值为1220时有199个素数,即长度len为199

 

输入大于2^20的数

 

 

 

 

此时素数列表的长度len是82025,求出的最大素数是1048577

 

代码如下

复制代码
/*
 * 筛选法计算小于100000的素数
 * 筛选法求最小的素数序列,原本是不朽的数学家们手工计算的方法,
 */

#include <iostream>
#include <cmath>

using namespace std;

const int MAXN = 2000000;
bool sieveflag[2000000 + 1] = { false, false, true };

void esieve(bool sflag[], int n)
{
    // 初始化
    for (int i = 3; i <= n; i++) {
        sflag[i++] = true;
        sflag[i] = false;
    }

    // 筛选
    long long int max = sqrt(n);
    for (int i = 3; i <= max; i++) {
        if (sflag[i]) {
            for (int j = i + i; j <= n; j += i)
                sflag[j] = false;
        }
    }

}

int main()
{
    int n;
    printf("请输入最大值n\n");
    scanf_s("%d", &n);
    
    esieve(sieveflag, n);
    int i;
    int num;
    for (i = 2, num = 0; i <= n; i++) {
        if (sieveflag[i]) {
            ++num;
            //cout << num << ":" << i << endl;
        }
    }
    cout << num << ":" << i << endl;

    return 0;
}
复制代码

 

posted @   ewdbdvdv  阅读(46)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示