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

最近学习加密算法,需要生成素数表,一开始使用简单的循环,从2开始判断。代码如下:
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<vector>
 5 #include<iterator>
 6 #include<algorithm>
 7 #include<ctime>
 8 #include<cstring>
 9 usingnamespace std;
10 bool isPrimeNumber(int num);
11 void judgePrimeNumber(int range,vector<int>&primeNumberList);
12 int main(void)
13 {
14     int range;
15     vector<int> primeNumberListJ;
16     while(cin){
17         cin >> range;
18         judgePrimeNumber(range, primeNumberListJ);
19         for(unsignedint i =0; i < primeNumberListS.size(); i++)
20             cout << primeNumberListJ.at(i)<< endl;
21         primeNumberListJ.clear();
22     }
23     return 0;
24 }
25 bool isPrimeNumber(int num)
26 {
27     if(num <2)
28         return false;
29     for(int i =2; i * i <= num; i++){
30         if(num % i ==0)
31             return false;
32     }
33     return true;
34 }
35 void judgePrimeNumber(int range,vector<int>&primeNumberList)
36 {
37     for(int i =2; i <= range; i++)
38         if(isPrimeNumber(i))
39             primeNumberList.push_back(i);
40 }

 

 
后来想起以前在学C语言的时候看过了叫筛选法的算法生成素数表。
筛选法又称筛法,具体做法是:先把N个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。
具体代码如下:
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<vector>
 5 #include<iterator>
 6 #include<algorithm>
 7 #include<ctime>
 8 #include<cstring>
 9 usingnamespace std;
10 bool isPrimeNumber(int num);
11 void selectPrimeNumber(int range,vector<int>&primeNumberList);
12 int main(void)
13 {
14     int range;
15     vector<int> primeNumberListS;
16     while(cin){
17         cin >> range;
18         selectPrimeNumber(range, primeNumberListS);
19         primeNumberListS.clear();
20     }
21     return 0;
22 }
23 bool isPrimeNumber(int num)
24 {
25     if(num <2)
26         return false;
27     for(int i =2; i * i <= num; i++){
28         if(num % i ==0)
29             return false;
30     }
31     returntrue;
32 }
33 void selectPrimeNumber(int range,vector<int>&primeNumberList)
34 {
35     bool*numMap =newbool[range +1];
36     memset(numMap,true,sizeof(bool)*(range +1));
37     numMap[1]=false;
38     for(int i =2; i <= range;){
39         while(!numMap[i]&& i <= range)
40             i++;
41         for(int j = i + i; j <= range; j += i){
42             if(!numMap[j])
43                 continue;
44             numMap[j]=false;
45         }
46         i++;
47     }
48     for(int i =1; i <= range; i++)
49         if(numMap[i])
50             primeNumberList.push_back(i);
51     delete[] numMap;
52 }

 

 
之后好奇心来了,筛选法到底比原来的方法高效了多少呢?
记得time.h里有有个clock()函数,可以返回程序运行到当前的时间,可以用它的计算两种算法的耗时。
具体代码如下:
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<vector>
 5 #include<iterator>
 6 #include<algorithm>
 7 #include<ctime>
 8 #include<cstring>
 9 usingnamespace std;
10 bool isPrimeNumber(int num);
11 void selectPrimeNumber(int range,vector<int>&primeNumberList);
12 void judgePrimeNumber(int range,vector<int>&primeNumberList);
13 int main(void)
14 {
15     int range;
16     vector<int> primeNumberListS;
17     vector<int> primeNumberListJ;
18     clock_t beginTime;
19     clock_t endTime;
20     while(cin){
21         cin >> range;
22         beginTime = clock();
23         selectPrimeNumber(range, primeNumberListS);
24         endTime = clock();
25         cout <<"select Time: "
26             <<double(endTime - beginTime)/ CLOCKS_PER_SEC
27            << endl;
28         beginTime = clock();
29         judgePrimeNumber(range, primeNumberListJ);
30         endTime = clock();
31         cout <<"judge Time: "
32             <<double(endTime - beginTime)/ CLOCKS_PER_SEC
33            << endl;
34         primeNumberListS.clear();
35         primeNumberListJ.clear();
36     }
37     return0;
38 }
39 bool isPrimeNumber(int num)
40 {
41     if(num <2)
42         return false;
43     for(int i =2; i * i <= num; i++){
44         if(num % i ==0)
45             return false;
46     }
47     return true;
48 }
49 void selectPrimeNumber(int range,vector<int>&primeNumberList)
50 {
51     bool*numMap =newbool[range +1];
52     memset(numMap,true,sizeof(bool)*(range +1));
53     numMap[1]=false;
54     for(int i =2; i <= range;){
55         while(!numMap[i]&& i <= range)
56             i++;
57         for(int j = i + i; j <= range; j += i){
58             if(!numMap[j])
59                 continue;
60             numMap[j]=false;
61         }
62         i++;
63     }
64     for(int i =1; i <= range; i++)
65         if(numMap[i])
66             primeNumberList.push_back(i);
67     delete[] numMap;
68 }
69 void judgePrimeNumber(int range,vector<int>&primeNumberList)
70 {
71     for(int i =2; i <= range; i++)
72         if(isPrimeNumber(i))
73             primeNumberList.push_back(i);
74 }

 

先输入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
不上图,自行尝试。

 

转载于:https://www.cnblogs.com/foundkey/p/6020716.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
<span style="color:rgb(0,0,0);font-family:'宋体';font-size:large;">要求:将程序代码复制粘贴到一个word文档中上传。</span><span style="color:rgb(0,0,0);font-family:'宋体';font-size:large;">程序如果是正确的,请在word文档中附上最后运行结果的截图。</span><p><span style="color:rgb(0,0,0);font-family:'宋体';font-size:large;">1、必做题</span></p><p> 本题要求实现一个判断素数的简单函数,以及利用该函数判断给定区间整数是否是素数,并按一行5个进行输出的函数。</p><p> 素数:只能被1和自身整除的正整数,1不是素数,2是素数</p><p> 函数接口定义:</p><p> int IsPrime(int x);</p><p> void PrintPrime(int m,int n);</p><p> 其中,函数IsPrime,当x是素数时返回1,否则返回0;函数PrintPrime输出区间[m,n]内的所有素数,按一行5个进行输出,同时要求输出的每列数据左对齐,若在此区间内没有素数,则输出“在此区间不存在素数”的提示信息。</p><p> 要求:main函数中输入两个正整数m和n,调用函数PrintPrime输出结果,函数PrintPrime需调用IsPrime函数来判定区间[m,n]内整数是否为素数。</p><p><br /></p><p>2、选做题</p><p> 有1对兔子,从第3个月开始每个月生一对兔子,生下来的兔子从第3个月开始也是每个月生一对,求第n个月兔子有几对?</p><p> 函数接口定义:</p><p> int rabbit(int n);</p><p> 要求:采用递归调用的方式求解兔子问题,在main函数中输入n,调用rabbit函数求出结果,在main函数中输出结果。</p><p> 输入样例1:</p><p> 6</p><p> 输出样例1:</p><p> 8</p><p> 输入样例2:</p><p> 12</p><p> 输出样例2:</p><p> 144</p><p><br /></p>
05-19

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值