最近学习加密算法,需要生成素数表,一开始使用简单的循环,从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. Go -- 接口赋值

    在go语言中,接口赋值分为2中情况: 1.将对象实例赋值给接口: 2.将一个接口赋值给另一个接口. 1.将对象实例赋值给接口: 要求对象实现了接口的所有方法. 2.将接口赋值给另一个接口: 假设接口A ...

  2. Android --修改arr文件

    1. 改为zip文件 2. 修改 3. 改后缀

  3. tomcat启动文件

    home目录下创建run.bat文件,文件内容如下: @echo off set JAVA_OPTS=-server -Xms1024m -Xmx1024m ^-XX:+UseG1GC ^-XX:Ma ...

  4. [ACM] hdu 1217 Arbitrage (bellman_ford最短路,推断是否有正权回路或Floyed)

    Arbitrage Problem Description Arbitrage is the use of discrepancies in currency exchange rates to tr ...

  5. javascript 转义函数

    // 字符转义 html2Escape(sHtml) { return sHtml.replace(/[<>&"]/g, function(c) { return { ' ...

  6. 简化动态MERGE的SQL计算

    MSSQL.ORACLE等数据库支持MERGE语句更新表.但表结构未知时,因为缺乏集合类数据.用存储过程获得表结构再动态拼出SQL很麻烦,代码会有几十行之多:相同原因,用Java等高级语言实现也不简单 ...

  7. HDU 1698 Just a Hook(线段树区间替换)

    题目地址:pid=1698">HDU 1698 区间替换裸题.相同利用lazy延迟标记数组,这里仅仅是当lazy下放的时候把以下的lazy也所有改成lazy就好了. 代码例如以下: # ...

  8. Laravel建站01--开发环境部署

    内容导航 安装git 安装composer 安装Laravel 既然是开发环境,就需要源代码管理.这里使用git来管理. 一:部署开发环境之前安装git 在 Linux 上安装git 如果你想在 Li ...

  9. IOS AFNETWORKING POST

    IOS AFNETWORKING POST 请求 #pragma mark post 请求 // 获取 url 路劲,不带参数 NSString *requestUrl = [[url compone ...

  10. 图像处理之opencv---加减乘除运算cvdiv

    http://chyyeng.blog.163.com/blog/static/16918230201211632135456/