C++高效计算素数的方法

来源:互联网 发布:咨询服务协议 软件 编辑:程序博客网 时间:2024/05/16 23:45

在网上看到很多计算素数的c++例子,本人试了一下觉得效率不高,于是自己写了个算,效率还算可以,如图!
也就跑了一会儿就算到了千万级

  • 我们要计算素数,首先要明确素数定义及性质:

分析题目理清思路

  1. 又称质数,有无限个。质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数
  2. 除2以外所有的偶数都不是素数;
  3. 判断一个数n是否为素数需判断它能否被2~(n-1)的数整除(余为0)
  4. 若n为大于或等于2的正整数,在n到 之间至少有一个质数
    ……
    以上所列或多或少都有作用,我们只一些核心的内容:“除2以外所有的偶数都不是素数” “判断它能否被2~(n-1)的数整除(余为0)”

    确定并改进for循环
    就此,我们大致可以使用for循环+if语句进行枚举判断,
    for(n=0;n<=1000000;n++)
    又根据第2条,我们可以节省很多时间不用去穷举,所以将for中的增量改为2,将初始值改为1(其实就是穷举除1的奇数进行判断)
    for(n=1;n<=1000000;n+=2) //n+=2是n=n+2缩写

    减少if判断次数及内容
    这里要用到一个数学性质,能减少程序的运算枚举量

    if(n%i==0)
    break;
    else if(n%i!0)
    输出语句:输出n
    改后
    if(n%i==0)
    break;
    if (i>sqrt(n))
    {
    输出语句
    }

优化
c++自带有计时函数,我们可以使用它来计时程序运行完需要的时间
clock()函数使用示例:

代码区块

纯原创手打,请珍惜他人智力成果!

#include<iostream>#include<ctime>  //for clock()#include<windows.h> //可无using namespace std;int main(){    long time; //clock的结果是个长整型变量clock_t start,finish;start=clock();        //计时开始     double a=0.3,b=1.2;    for(int x;x<=2000;x++)  //循环2000次    {    a=a*b;    cout<<a<<endl;    }     Sleep(1000); //调用windows.h库暂停finish=clock();   //计时结束time=(finish-start)/1000;     //转化为秒    cout<<"运行程序共用 "<<time<<"秒\n";  return 0;} 
最后放上**计算素数**的代码,也许还有改进方法,欢迎讨论
#include<iostream>#include<cmath>#include<ctime>//作者:猪猪 CSDN:jackjob404 TIEBA:@V超级猪猪 using namespace std;int main(){system("title 计算素数");system("cls");//以上两句可省略     long time;int i,t=2;long long n;clock_t start,finish;start=clock();cout << "10E素数有:\n[第1组]2" << endl;for (n=3;n<=1000000000;n+=2){for(i=2;i<=sqrt(n);i++)if(n%i==0)  break;if (i>sqrt(n)){    t++;cout <<"[第"<<t<<"组]"<<n<<endl;}}finish=clock();time=(finish-start)/100000;cout <<"10E内素数共有"<<t<<"对\n共花费"<<time<<"秒"<<endl;return 0;}
原创粉丝点击