C/C++判断素数的三种方法

 更新时间:2023年12月19日 10:01:52   作者:释怀、过客。  
这篇文章主要给大家介绍了C/C++判断素数的三种方法,常规的函数判断法,埃氏筛法和欧拉筛法这三种方法,并通过代码示例讲解的非常详细,具有一定的参考价值,需要的朋友可以参考下

1.常规的函数判断法

假如题目是我们要求 1~n之间的素数并打印出来,我们可以写如下函数:

int prime(int i) // 求是否为素数需要考虑1,2两种情况
{
    if (i == 1) return 0;
    if (i == 2) return 1;
    for (int j = 2; j * j <= i; ++j)
        if (i % j == 0)//如果遇到j是i的因数,i就不是质数,返回0
            return 0;
    return 1;//没有找到这个数的因数就返回1
}
int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i)
        if (prime(i))
            printf("%d ", i);
    return 0;
}

2.埃氏筛法

我们在幼儿园就学过合数是除了能被1和它本身整除,还能被其他的正整数整除的数,然而合数还有如下定义:当一个数可以被素数之乘积表示时,它被称为合数。这是基本定理算术,也被称为唯一素因数分解定理。这个定理表明任何一个大于1的整数都可以被唯一地分解成素数的乘积。

埃氏筛核心思想就是 从第一个没有被筛除过数(num)的开始,在给定的范围内依次筛去num的倍数,例如,num=2,我们可以依次筛去4,6,8......;对于,num=n,依次筛除 k*n(k=1,2,3...);

代码实现:

int pri[10000001];
int main()
{ 
    int n;
    scanf("%d",&n);
    for(int i = 2; i*i <= n; i++)//埃氏筛   时间复杂度接近于线性(n*lnln(n))
	{
		if(pri[i] == 0)
		{
			for(int j = i * i; j <= n; j += i)
			    pri[j] = 1; // j是i的一个倍数,则j是合数,筛掉。
		}
        
}

3.欧拉筛

这是对埃氏筛的优化,埃氏筛法在执行时可能会对同一个数进行多次筛除

比如num=120  会在i=(2,3,4,6......)的时候分别筛除一次,而且数越大会被筛除的次数越多,就造成了很大的时间浪费

而欧拉筛的核心思想就是确保每个合数只被最小质因数筛掉。

代码实现:

int vis[10000001];
int pri[10000001];
int main()
{ 
    int n=10000,m=0,cnt=0;
 
    for (int i = 2; i <= n; i ++ )//欧拉筛 时间复杂度基本为O(n)
    {
        if (vis[i] == 0) pri[cnt ++ ] = i;//将质数存到pri中
        for (int j = 0; pri[j] * i <= n; j ++ )//要确保当前质数的i倍小于等于n。
        {
            vis[pri[j] * i] = 1;
           
            if (i % pri[j] == 0) break;//终止条件(当前数i遇到了它的最小质因数)
        }
    }
     
 
    return 0;
}

以上就是C/C++判断素数的三种方法的详细内容,更多关于C/C++判断素数的资料请关注脚本之家其它相关文章!

相关文章

  • c++ 形状类Shape(派生出圆类Circle和矩形类Rectangle)

    c++ 形状类Shape(派生出圆类Circle和矩形类Rectangle)

    通过C++方式,建立一个形状类Shape作为基类,派生出圆类Circle和矩形类Rectangle 求出面积并获取相关信息
    2020-11-11
  • 基于Windows API实现遍历所有文件并删除的方法

    基于Windows API实现遍历所有文件并删除的方法

    这篇文章主要介绍了基于Windows API实现遍历所有文件并删除的方法,是win32应用程序的一个比较典型的文件操作应用技巧,需要的朋友可以参考下
    2015-04-04
  • c++ 判断是64位还是32位系统的实例

    c++ 判断是64位还是32位系统的实例

    这篇文章主要介绍了c++ 判断是64位还是32位系统的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • c语言重要的字符串与内存函数

    c语言重要的字符串与内存函数

    这篇文章主要介绍一些c语言中常用字符串函数和内存函数的使用和注意事项,并且为了帮助读者理解和使用,也都模拟实现了他们的代码,需要的朋友可以参考一下
    2021-09-09
  • C语言中字符和字符串处理(ANSI字符和Unicode字符)

    C语言中字符和字符串处理(ANSI字符和Unicode字符)

    这篇文章主要介绍了C语言与C++中字符和字符串处理(ANSI字符和Unicode字符)的详细内容,非常的全面,这里推荐给大家,希望大家能够喜欢。
    2015-03-03
  • C/C++实现获取系统时间的示例代码

    C/C++实现获取系统时间的示例代码

    C 标准库提供了 time() 函数与 localtime() 函数可以获取到当前系统的日历时间。本文将通过一些简单的示例为大家讲讲C++获取系统时间的具体方法,需要的可以参考一下
    2022-12-12
  • C++详细讲解函数调用与Struct和CLass的区别

    C++详细讲解函数调用与Struct和CLass的区别

    主调函数使用被调函数的功能,称为函数调用。在C语言/C++中,只有在函数调用时,函数体中定义的功能才会被执行,下面让我们详细来了解
    2022-05-05
  • C语言深入分析浮点型数据存储

    C语言深入分析浮点型数据存储

    使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当您创建一个变量时,就会在内存中保留一些空间。您可能需要存储各种数据类型的信息,操作系统会根据变量的数据类型,来分配内存和决定在保留内存中存储什么
    2022-08-08
  • C++ Boost PropertyTree示例超详细讲解

    C++ Boost PropertyTree示例超详细讲解

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • C++深入细致探究二叉搜索树

    C++深入细致探究二叉搜索树

    二叉搜索树是以一棵二叉树来组织的。每个节点是一个对象,包含的属性有left,right,p和key,其中,left指向该节点的左孩子,right指向该节点的右孩子,p指向该节点的父节点,key是它的值
    2022-05-05

最新评论