素数算法的不同等级
来源:互联网 发布:移动网络优化 陆巡 编辑:程序博客网 时间:2024/05/21 10:23
题目:求小于等于自然数N(N>=2)内的所有素数。
等级一:
int nFlag = 10000;int nCount = 0;for(int i = 2; i<=nFlag; i++){bool bSS = true;for(int j = 2; j<i; j++){if(i%j == 0){bSS = false;break;}}if(bSS){//cout<<i<<'\t';nCount++;}}
N=10000,运行时间是21 ms
等级二:
优化:所有偶数中,只有2是素数
int nFlag = 10000;int nCount = 1;for(int i = 3; i<=nFlag; i+=2){bool bSS = true;for(int j = 3; j<i; j+=2){if(i%j == 0){bSS = false;break;}}if(bSS){//cout<<i<<'\t';nCount++;}}
N=10000,运行时间是10 ms
等级三:
优化:公约数都是成对出现的,所以只要小于sqrt(i)里没有整除的数即可。
int nFlag = 10000;int nCount = 1;for(int i = 3; i<=nFlag; i+=2){bool bSS = true;float fSqrt = sqrt((float)i);for(int j = 3; j<=fSqrt; j+=2){if(i%j == 0){bSS = false;break;}}if(bSS){//cout<<i<<'\t';nCount++;}}
N=10000,结果是:1229 运行时间是0.33 ms
等级四:
优化:只需要确保不能整除小于sqrt(i)的所有素数即可。
int nFlag = 10000;vector<int> vctInt;vctInt.push_back(2);for(int i = 3; i<=nFlag; i+=2){bool bSS = true;float fSqrt = sqrt((float)i);for(int j = 0; vctInt[j]<=fSqrt; j++){if(i%vctInt[j] == 0){bSS = false;break;}}if(bSS){//cout<<i<<'\t';vctInt.push_back(i);}}
N=10000,结果是:1229 运行时间是0.28 ms (这里应该在vector的管理上花费了不少时间)
N=100000000,结果是:5761455 运行时间是25.7 s
等级五:
优化:用内存标记存储素数.
int nSet = 100000000;byte *bFlag = new byte[nSet+1];memset(bFlag, 0, sizeof(byte)*nSet);bFlag[0] = bFlag[1] = 1;int nCout = 1;int nSqrt = (int)sqrt((float)nSet);for(int j = 2; j<=nSet; j+=2){bFlag[j] = 1;}for(int i = 3; i<=nSet; i+=2){if(!bFlag[i]){int nStart = i;if(i<=nSqrt)nStart *= i;nCout++;for(int j = nStart; j<=nSet; j += 2*i){if(!bFlag[j])bFlag[j] = 1;}}}delete []bFlag;
N=100000000,结果是:5761455 运行时间是2458 ms
等级六:
优化:从小到大,每找到一个新的素数s,只需将s*h(s*h<N)的标记置为1即可。(h为大于等于s的所有标记尚且为0的数)
int nSet = 100000000;byte *bFlag = new byte[nSet+1];memset(bFlag, 0, sizeof(byte)*nSet);bFlag[0] = bFlag[1] = bFlag[2] = 1;int nCout = 1;int nSqrt = (int)sqrt((float)nSet);for(int j = 2; j<=nSet; j+=2){bFlag[j] = 1;}for(int i = 3; i<=nSet; i+=2){if(!bFlag[i]){nCout++;if(i <= nSqrt+1){for(int j = nSet/i%2 ? nSet/i: nSet/i-1; j>=i; j -= 2){if(bFlag[j] == 0)bFlag[i*j] = 1;}}}}cout<<"Count Num:"<<nCout<<endl;delete []bFlag;
N=100000000,结果是:5761455 运行时间是1172ms
PS:表达不是很清楚,而且个人感觉这个算法还没有到极限,希望高人能指导一下,给出更好的算法。
- 素数算法的不同等级
- 素数算法的不同等级
- 不同等级的标签对比
- 不同等级标签的对比
- 不同等级的debug信息打印
- Log4j不同等级输入不同文件的配置
- [转]Log4j不同等级输入不同文件的配置
- 算法训练 成绩的等级输出
- 算法训练 成绩的等级输出
- QQ等级图标对应的算法
- 算法训练 成绩的等级输出
- 不同css等级的人对css的看法
- 不同事务隔离等级下的MVCC实现
- C语言多线程下不同等级日志的实现
- 产生素数的算法
- 判断素数的算法
- 强大的素数算法
- 判断素数的算法
- jQuery的.bind()、.live()和.delegate()之间区别
- 仿XP画图板—升级版
- 给你学习java的五大理由
- 安卓布局总结
- C++ const总结
- 素数算法的不同等级
- BroadcastReceiver总结
- 如何用scanf()输入带空格的我爱你
- sizeof
- 设计模式之访问者模式
- easyui配置
- Quartz 2D编程指南 - 变换
- java中常用的字符串的截取方法
- 海量数据相似度计算之simhash和海明距离