最近学习加密算法,需要生成素数表,一开始使用简单的循环,从2开始判断。代码如下:
 #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<iterator>
#include<algorithm>
#include<ctime>
#include<cstring>
usingnamespace std;
bool isPrimeNumber(int num);
void judgePrimeNumber(int range,vector<int>&primeNumberList);
int main(void)
{
int range;
vector<int> primeNumberListJ;
while(cin){
cin >> range;
judgePrimeNumber(range, primeNumberListJ);
for(unsignedint i =; i < primeNumberListS.size(); i++)
cout << primeNumberListJ.at(i)<< endl;
primeNumberListJ.clear();
}
return 0;
}
bool isPrimeNumber(int num)
{
if(num <)
return false;
for(int i =; i * i <= num; i++){
if(num % i ==)
return false;
}
return true;
}
void judgePrimeNumber(int range,vector<int>&primeNumberList)
{
for(int i =; i <= range; i++)
if(isPrimeNumber(i))
primeNumberList.push_back(i);
}
 
后来想起以前在学C语言的时候看过了叫筛选法的算法生成素数表。
筛选法又称筛法,具体做法是:先把N个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。
具体代码如下:
 #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<iterator>
#include<algorithm>
#include<ctime>
#include<cstring>
usingnamespace std;
bool isPrimeNumber(int num);
void selectPrimeNumber(int range,vector<int>&primeNumberList);
int main(void)
{
int range;
vector<int> primeNumberListS;
while(cin){
cin >> range;
selectPrimeNumber(range, primeNumberListS);
primeNumberListS.clear();
}
return 0;
}
bool isPrimeNumber(int num)
{
if(num <)
return false;
for(int i =; i * i <= num; i++){
if(num % i ==)
return false;
}
returntrue;
}
void selectPrimeNumber(int range,vector<int>&primeNumberList)
{
bool*numMap =newbool[range +];
memset(numMap,true,sizeof(bool)*(range +));
numMap[]=false;
for(int i =; i <= range;){
while(!numMap[i]&& i <= range)
i++;
for(int j = i + i; j <= range; j += i){
if(!numMap[j])
continue;
numMap[j]=false;
}
i++;
}
for(int i =; i <= range; i++)
if(numMap[i])
primeNumberList.push_back(i);
delete[] numMap;
}
 
之后好奇心来了,筛选法到底比原来的方法高效了多少呢?
记得time.h里有有个clock()函数,可以返回程序运行到当前的时间,可以用它的计算两种算法的耗时。
具体代码如下:
 #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<iterator>
#include<algorithm>
#include<ctime>
#include<cstring>
usingnamespace std;
bool isPrimeNumber(int num);
void selectPrimeNumber(int range,vector<int>&primeNumberList);
void judgePrimeNumber(int range,vector<int>&primeNumberList);
int main(void)
{
int range;
vector<int> primeNumberListS;
vector<int> primeNumberListJ;
clock_t beginTime;
clock_t endTime;
while(cin){
cin >> range;
beginTime = clock();
selectPrimeNumber(range, primeNumberListS);
endTime = clock();
cout <<"select Time: "
<<double(endTime - beginTime)/ CLOCKS_PER_SEC
<< endl;
beginTime = clock();
judgePrimeNumber(range, primeNumberListJ);
endTime = clock();
cout <<"judge Time: "
<<double(endTime - beginTime)/ CLOCKS_PER_SEC
<< endl;
primeNumberListS.clear();
primeNumberListJ.clear();
}
return0;
}
bool isPrimeNumber(int num)
{
if(num <)
return false;
for(int i =; i * i <= num; i++){
if(num % i ==)
return false;
}
return true;
}
void selectPrimeNumber(int range,vector<int>&primeNumberList)
{
bool*numMap =newbool[range +];
memset(numMap,true,sizeof(bool)*(range +));
numMap[]=false;
for(int i =; i <= range;){
while(!numMap[i]&& i <= range)
i++;
for(int j = i + i; j <= range; j += i){
if(!numMap[j])
continue;
numMap[j]=false;
}
i++;
}
for(int i =; i <= range; i++)
if(numMap[i])
primeNumberList.push_back(i);
delete[] numMap;
}
void judgePrimeNumber(int range,vector<int>&primeNumberList)
{
for(int i =; i <= range; i++)
if(isPrimeNumber(i))
primeNumberList.push_back(i);
}
先输入100测试一下,结果如下:

 应该是测试数据太小了,直接上10000吧:
会发现,但素数表越大,两者差距也越大。范围再大10倍的话,循环判断就卡了好就还没出时间。
 
最后额外的,在写程序的时候,经常要测试,当测试数据比较简短的时候可以手动输入。当测试数据比较多的时候,可以保存到txt文本文件中,放到测试程序的所在的目录下。
 
然后打开cmd命令,进入到测试程序所在的路径。
键入
  1. coding.exe < in.txt
结果如下:
 
 自动输入测试数据。
注意尖括号的方向。
另外一个方向的尖括号可以用于保存程序输出结果:
  1. coding.exe > out.txt

 在测试程序所在的目录下会自动生成out.txt。

 
最后的最后,一个高级的写法,从文件中读取输入,把结果输出到文件中:
  1. type in.txt | coding.exe > out.txt
不上图,自行尝试。

<编程>比较两种素数表生成算法+计算程序运行时间+通过CMD重定向测试程序的更多相关文章

  1. ACM -- 算法小结(十)素数的两种打表法

    素数的两种打表法 下面介绍两种素数打表法,由于是两年前留下的笔记,所以没有原创链接~~ @_@!! 第一种疯狂打表法: #include<stdio.h> #include<math ...

  2. Perl 面向对象编程的两种实现和比较:

    <pre name="code" class="html">https://www.ibm.com/developerworks/cn/linux/ ...

  3. IPVS和Nginx两种WRR负载均衡算法详解

    动机 五一临近,四月也接近尾声,五一节乃小长假的最后一天.今天是最后一天工作日,竟然感冒了,半夜里翻来覆去无法安睡,加上窗外大飞机屋里小飞机(也就是蚊子)的骚扰,实在是必须起来做点有意义的事了!    ...

  4. 两种常用的全排列算法(java)

    问题:给出一个字符串,输出所有可能的排列. 全排列有多种算法,此处仅介绍常用的两种:字典序法和递归法. 1.字典序法: 如何计算字符串的下一个排列了?来考虑"926520"这个字符 ...

  5. iOS打包为ipa的两种方式和生成P12证书的方式

    iOS项目打包为ipa的两种方式: 准备工作:先行在Xcode里面打开preferences,填写apple id. 通过iTunes+Xcode 在Xcode里,把模拟器调整为iOS Device, ...

  6. js实现两种实用的排序算法——冒泡、快速排序

      分类:js (4443) (0) 零:数据准备,给定数组arr=[2,5,4,1,7,3,8,6,9,0]; 一:冒牌排序 1思想:冒泡排序思想:每一次对比相邻两个数据的大小,小的排在前面,如果前 ...

  7. Go -- 并发编程的两种限速方法

    引子 golang提供了goroutine快速实现并发编程,在实际环境中,如果goroutine中的代码要消耗大量资源时(CPU.内存.带宽等),我们就需要对程序限速,以防止goroutine将资源耗 ...

  8. golang并发编程的两种限速方法

    引子 golang提供了goroutine快速实现并发编程,在实际环境中,如果goroutine中的代码要消耗大量资源时(CPU.内存.带宽等),我们就需要对程序限速,以防止goroutine将资源耗 ...

  9. 异步编程的两种模型,闭包回调,和Lua的coroutine,到底哪一种消耗更大

    今天和人讨论了一下CPS变形为闭包回调(典型为C#和JS),以及Lua这种具有真正堆栈,可以yield和resume的coroutine,两种以同步的形式写异步处理逻辑的解决方案的优缺点.之后生出疑问 ...

随机推荐

  1. UVA - 1416 Warfare And Logistics (最短路)

    Description The army of United Nations launched a new wave of air strikes on terroristforces. The ob ...

  2. c++ 操作Mysql ado

    #pragma once #ifndef DB_MYSQL_H #define DB_MYSQL_H   #include "stdafx.h" #include <wins ...

  3. PHP 实现Word,excel等转换pdf

    近期做一个项目,须要将用户上传的word,excel文档转成PDF文档保存并打印.在网上找了非常多资料.并不全面,所以自己写了一份比較全面的教程来分享. 以下是操作步骤: 1.        安装免费 ...

  4. 负载均衡之F5设备

    http://xjsunjie.blog.51cto.com/999372/666672 目前全球范围内应用比较广泛的负载均衡设备为美国的F5.F5于2000年底进驻中国,在国内业界,F5负载均衡产品 ...

  5. mysql flush详解

    http://www.cnblogs.com/ggjucheng/archive/2012/11/07/2758021.html   cnblogs - FLUSH TABLES WITH READ ...

  6. GB28181对接视频流

    今天抽空写下以GB28181的方式获取摄像机视频流以备后用,同时也希望能帮助到正着手开发GB28181对接视频的同学,这块的资料实在不多. 今天讲的内容不涉及到平台对接,平台对接下次有时间再讲,平台对 ...

  7. iLBC简要介绍

    iLBC(internet lowbitrate codec):是全球著名语音引擎提供商Global IP Sound开发,它是低比特率的编码解码器,提供在丢包时具有的强大的健壮性.iLBC 提供的语 ...

  8. cocos2dx-3.1 接入多盟广告sdk+Android (2)

    上篇,把基本工作做完了,接下来,在C++下加入代码. 1.打开win32下的project,加入一个类.DomobAd.代码例如以下, <pre name="code" cl ...

  9. 通过串口工具下发指令的Python脚本

    前言 最近一段时间在测试物联网相关的App自动化,涉及通过串口工具给硬件设备下发指令. 使用的串口工具:SecureCRT 解决办法 通过引用Python的第三方库:serial,通过编写Python ...

  10. (转)MongoDB在mongo控制台下的基本使用命令

    成功启动MongoDB后,再打开一个命令行窗口输入mongo,就可以进行数据库的一些操作. 输入help可以看到基本操作命令: show dbs:显示数据库列表 show collections:显示 ...