采用三种方法计算质数,并比较运行时间

#include<iostream>
#include<time.h>
#include<vector>
using namespace std;

#define N 100000000

char a[N/8+1];

class Time
{
    clock_t clockBegin;
    clock_t clockEnd;
public:
    void Start()
    {
        clockBegin = clock();
    }
    int End()
    {
        clockEnd = clock();
        return clockEnd - clockBegin;
    }
    int Interval()
    {
        return clockEnd - clockBegin;
    }
};
void SetBit(int i,bool tf)
{
    int x=i&7;
    int index=i>>3;
    if(tf)
    {
       a[index]=a[index]|(1<<(x));
    }
    else
    {
       a[index]=a[index]&(~(1<<(x)));
    }

}
bool GetBit(int i)
{
    int x=i&7;
    int index=i>>3;
    if(a[index]&(1<<(x)))
    {
        return true;
    }
    else
        return false;

}
// 通过质数进行帅选的优化方法
void FilterMethod1()
{

    int i;
    int count=0;
    int currentIndex=2; // 进行帅选的起始值,从最小的质数2开始
    memset(a,0xff,sizeof(a));
    i=currentIndex;
    for(;i<=sqrt(N);)   // 进行筛选的数最大是根号N
    {
        int j=2;
        while(j*i<=N)  // 把所有i的倍数肯定不是质数
        {
            SetBit(j*i,false);
            j++;
        }
        int k=i+1;     //搜素[i+1,i*i]的区间,这个区间的质数是已经被算出来的,在这个区间中找出下一个质数
        while(k<=i*i)
        {
            if(GetBit(k)) // 不为零,说明是质数
            {
                break;
            }
            k++;
        }
        i=k;    // 用搜索到的质数进行筛选
    }
    for(i=2;i<=N;i++) // 这里1不是质数
    {
        if(GetBit(i))
        {
          count++;
        }
    }
    cout<<"\nFilterMethod1计算出质数量="<<count<<endl;
    cout<<endl;
}
// 普通的筛选方法
void FilterMethod2()
{
    int i;
    int count=0;
    memset(a,0xff,sizeof(a));
    for(i=1;i<=N;i++)
    {
        SetBit(i,true);
    }
    for(i=2;i<=N/2;i++)
    {
        int j=2;
        while(j*i<=N)
        {

            SetBit(j*i,false);
            j++;
        }
    }
    for(i=2;i<=N;i++) // 这里1不是质数
    {
        if(GetBit(i))
        {
          count++;
        }
    }
    cout<<"\nFilterMethod1计算出质数量="<<count<<endl;
    cout<<endl;
}
// 采用除法计算质数
void DivMethod()
{
    int i;
    vector<int> vec;
    vec.push_back(2);
    for(i=3;i<=N;i++)
    {
        int j;
        int iSqrt=sqrt(i);
        for(j=0;j<vec.size()&&j<=iSqrt;j++)  // 不计算1
        {
            if(i%vec[j]==0)
            {
                break;
            }
        }
        if(j>=vec.size()||j>iSqrt)
        {
            vec.push_back(i);
        }
    }
    cout<<"\nDivMethod1计算出质数量="<<vec.size()<<endl;
    cout<<endl;
}

int main()
{

    Time tFilter;
    tFilter.Start();
    FilterMethod1();
    tFilter.End();
    cout<<"采用质数优化的方法:"<<tFilter.Interval()<<"毫秒"<<endl;

    tFilter.Start();
    FilterMethod2();
    tFilter.End();
    cout<<"普通筛选法:"<<tFilter.Interval()<<"毫秒"<<endl;

    tFilter.Start();
    DivMethod();
    tFilter.End();
    cout<<"试除法:"<<tFilter.Interval()<<"毫秒"<<endl;

    system("pause");

    return 0;
}
时间: 2024-12-17 03:04:34

采用三种方法计算质数,并比较运行时间的相关文章

Python三种方法计算指定日期是今年的第几天

今天早上和腾讯面试官进行了视频面试,由于音量和网络以及我的垃圾电脑的原因,个人感觉黄了... 最后面试官给了我一道简单的计算题:指定日期是今年的第几年 由于电脑卡到打字都打不动,我勉勉强强写了一点,虽然面试官知道了我的想法也了解我的设备情况,最后没让我写完 但是心里惭愧还是时候补齐了...话不多说回到主题吧 首先是输入的问题,个人认为分别输入年月份是一件很初级的要求,就实现了形如“2020-3-26”的字符串解析的两种方法,代码如下: 1 def cal_date_str_spilt(date)

Python两种方法计算MD5值

1.Python内置md5模块 1 #-*- coding:utf-8 -*- 2 3 import md5 4 5 def Str2Md5(s): 6 m=md5.new() 7 m.update(s) 8 return m.hexdigest() 9 10 if __name__=="__main__": 11 s="www.baidu.com" 12 print Str2Md5(s) 2.Python的hashlib模块 1 #-*- coding:utf-8

C# 4种方法计算斐波那契数列 Fibonacci

F1: 迭代法 最慢,复杂度最高 F2: 直接法 F3: 矩阵法 参考<算法之道(The Way of Algorithm)>第38页-魔鬼序列:斐波那契序列 F4: 通项公式法 由于公式中包含根号5,无法取得精确的结果,数字越大误差越大 1 using System; 2 using System.Diagnostics; 3 4 5 namespace Fibonacci 6 { 7 class Program 8 { 9 static void Main(string[] args) 1

C#计算一段程序运行时间的三种方法

第一种方法利用System.DateTime.Now static void SubTest() { DateTime beforDT = System.DateTime.Now; //耗时巨大的代码 DateTime afterDT = System.DateTime.Now; TimeSpan ts = afterDT.Subtract(beforDT); Console.WriteLine("DateTime总共花费{0}ms.", ts.TotalMilliseconds);

Java 计算中英文长度的若干种方法

在项目开发中经常碰到到输入字符的校验,特别是中英文混合在一起的校验.而为了满足校验的需求,有时需要计算出中英文的长度. 本文将通过几种常用的方法实现长度的计算: <span style="font-size:18px;">import java.io.UnsupportedEncodingException; /** * 中英文校验的处理 * @author a123demi * */ public class EnChValidate { public static vo

【九天教您南方cass 9.1】 10 DTM土方计算的四种方法

同学们大家好,欢迎收看由老王测量上班记出品的cass9.1视频课程 我是本节课主讲老师九天. 我们讲课的教程附件也是共享的,请注意索取测量空间中. 九天老师的联系方式  点击直接请教九天老师吧! DTM土方计算的四种方法 课程教案 一.根据坐标文件. (1).-->根据坐标文件 (2).-->指定坐标文件 (3).-->DTM土方计算参数设置 (4).-->得出结果dtmtf.log (5).-->并指定三角网法土石方计算成果表的位置 二.根据图上高程点. (1).-->

计算幂函数的几种方法

引言 我们知道,自然对数的底 e 定义为以下极限值: 这个公式很适合于对幂函数的计算进行一些测试,得到的结果是 e 的近似值,不用担心当 n 很大时计算结果会溢出. 测试程序 下面就是 Tester.cs: 1 using System; 2 using System.Numerics; 3 using System.Diagnostics; 4 using Skyiv.Extensions; 5 6 namespace Skyiv.Test 7 { 8 sealed class Tester

获取时间和计算时间差的几种方法总结

转载自:http://blog.csdn.net/coder_xia/article/details/6566708 一.标准C和C++都可用 1.获取时间用time_t time( time_t * timer ),计算时间差使用double difftime( time_t timer1, time_t timer0 ). 精确到秒. 测试程序如下: 1 #include <time.h> 2 #include <stdio.h> 3 int main() 4 { 5 time

Linux下计算字符串长度的四种方法

在linux运维场景中,经常会碰到计算字符长度的场景,这里罗列四种方法: [[email protected] ~]# char="I love you" 方法一:[[email protected] ~]# echo ${#char} 方法二:[[email protected] ~]# expr length "$char" 方法三:[[email protected] ~]# echo $char|wc -L 方法四:[[email protected] ~]