理论知识.质数打表

2024-05-30 01:36
文章标签 质数 打表 理论知识

本文主要是介绍理论知识.质数打表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

啊,哈喽,小伙伴们大家好。我是#张亿,今天呐,学的是理论知识.质数打表

为什么需要质数打表

我们已经学习了如何判断一个数是不是质数了,但是还不够。假设要判断很多很多个数是不是质数的时候,之前的学习的方法效率不够高。因为,如果 n 是质数,需要从 2 枚举到 sqrt(n) ,如果题目里面要你几百几千个数逐一判断是否是质数,则很可能会超时。

所谓 质数打表,是指先通过一段比较高效的代码,完成了前期运算,把每一个数是不是质数的信息 表格化 ,在程序的其它位置,如果需要判断一个数是不是质数,只需要去这个预先计算好的表格里面查一下就可以了。

质数打表的算法思路

我们只需要把合数找到,那么自然就能找到质数了。而找合数的思路,则是:从小到大去找质数,每找到一个新的质数,则去把这个质数的倍数标记出来,这些倍数就是合数,而那些自始至终没有被标记过的数就是质数。例如,当我们指导 13 是质数的时候,我们就把 26,39,52,65... 等一系列的合数标记出来。课程E.倍数 的这条题就是演练这个算法思想的。

下面是质数打表的代码:

bool flag[1000001];
void prepare_prime() //质数打表的函数 
{int i,j;for(i=2;i<=1000000;i++){if(!flag[i]) //表示 i是一个质数{for(j=2;i*j<=1000000;j++) //对 j 的倍数(不包含自己)全部设置标记,表示这些数是合数 flag[i*j] = true; }}
}

Copy

执行了上面的 prepare_prime( ) 函数,就产生了 1000000 以内的质数表了。当 flag[i] 为true,表示 i 是合数,flag[i] 为 false 则表示 i 是质数。 1 是特殊的,1 既不是质数又不是合数,单独判断。

常见错误

本来题目要你找出 n 以内的素数,但是你打表的时候的第一层循环只循环到 sqrt(n) ,这是错误的,这会漏掉了很多 比 sqrt(n) 大的质数。

这篇关于理论知识.质数打表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1015213

相关文章

LeetCode--204 计数质数

题目 统计所有小于非负整数 n 的质数的数量。 示例 示例:输入: 10输出: 4解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。 class Solution {public:int countPrimes(int n) {if (n <= 2) return 0;int cnt = 0;vector<bool> isPrime(n, true);

计算质数通过分区(Partition)提高Spark的运行性能

在Sortable公司,很多数据处理的工作都是使用Spark完成的。在使用Spark的过程中他们发现了一个能够提高Spark job性能的一个技巧,也就是修改数据的分区数,本文将举个例子并详细地介绍如何做到的。 查找质数   比如我们需要从2到2000000之间寻找所有的质数。我们很自然地会想到先找到所有的非质数,剩下的所有数字就是我们要找的质数。   我们首先遍历2到2000000之间的每个数

c++质数判断 使用sqrt

质数判断 使用sqrt 如果一个整数能被分解成2个数的乘积,那么小的那个数一定不会超过这个数的开方。使用sqrt函数求解质数不使用sqrt函数求解质数 如果一个整数能被分解成2个数的乘积,那么小的那个数一定不会超过这个数的开方。 1不是质数。 8 => 2*4, 4*2 sqrt(8) =>3.xx 9 => 3*3 sqrt(9) =>3 11 => sqrt(11)

深度学习(理论知识)

一、监督学习、自监督和半监督 1、监督学习(Supervised Learning) 概念 监督学习是一种机器学习方法,通过使用带标签的数据进行训练,模型学习从输入到输出的映射关系。数据集中的每个样本都包含输入特征(features)和对应的标签(labels)。 关键点 标签数据:每个训练样本都有明确的标签,表示期望的输出。 映射函数:模型学习一种映射函数,将输入特征映射到对应的标签。 目

密码学及其应用——为什么选择接近的质数因子对RSA加密算法不安全?

RSA加密算法是一种广泛使用的非对称加密算法,它的安全性依赖于大整数分解的难度。具体来说,RSA算法生成的公钥包含一个大整数N,这是两个大质数p和q的乘积。然而,如果这两个质数p和q太接近,则可以相对容易地对N进行因式分解,从而破解加密。 1. 质数选择的影响         在RSA加密算法中,选择的质数p和q不应过于接近。如果p和q的差距很小,那么可以通过以下方法进行因式分

力扣第204题“计数质数”

在本篇文章中,我们将详细解读力扣第204题“计数质数”。通过学习本篇文章,读者将掌握如何使用埃拉托色尼筛法来解决这一问题,并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释,以便于理解。 问题描述 力扣第204题“计数质数”描述如下: 统计所有小于非负整数 n 的质数的数量。 示例: 输入: n = 10输出: 4解释: 小于 10 的质数是 2, 3, 5, 7, 共计

hdu1407 测试你是否和LTC水平一样高(数学:打表)

受之前做的几道题影响,第一反应就是打表 但我之前打表是三重循环从小到大遍历,这样就很有问题了 比如输入201,对应结果应该为1, 2, 14 但我的方法输出结果为4, 8, 11 很难设置判别条件使得输出结果最小 于是想到了从大到小遍历 但是用打表这个题有问题,就是给的数据并不在10000以内 我开数组开到17000还是错 开到20000才过,用时0ms 代码如下: #in

poj 3090 Visible Lattice Points(数论:筛法打表欧拉函数)

和之前做过的一个题很像 对于size==4 从1到4考虑y坐标 不妨设x>=y y==1: (1,1) y==2: (1,2) y==3: (1, 3) (2, 3) y==4: (1, 4) (3, 4) 共6个满足条件,把x y交换下且去除(1, 1)的重复情况得到2×6-1=11 再加上(0,1) (1,0)两种情况得到13 所以结果应该为: 代码如下: #

poj 2478 Farey Sequence(数论:欧拉函数+打表)

注意括号内分数分母相同时的区别 f(5)中以5为分母的数其分子均与5互质 进而推得:f(n)中以i为分母的数其各个分子均与i互质 因此: 用筛选法打表phi,再预处理下即可 看到别人说也可以用欧拉函数的积性性质来做,有兴趣的可以看一下 我的代码如下: #include <stdio.h>#define MAXN 1001000#define LL long longLL ph

TensorFlow入门(一)——理论知识介绍及简单代码实现

TensorFlow入门(一)——理论知识介绍及简单代码实现 一、TensorFlow安装二、TensorFlow计算模型——计算图(Graph)概念属性 三、TensorFlow数据模型——张量(Tensor)概念属性名字——name维度——shape类型——type 查看Tensor具体内容 四、Tensorflow运行模型——会话(Session)概念使用步骤方式一(不推荐)方式二(推