super_数学知识(质数筛选和约数学习)lesson08易错题记录

news2024/11/17 17:35:09

文章目录

  • 回文质数
  • 第n小的质数
  • 素数个数

回文质数

在这里插入图片描述
先上代码

#include<iostream>
#include<vector>//创建动态数组需要的头文件
#include<cstring>//使用memset需要的头文件
using namespace std;
vector<int> q;
bool arr[10000005];
//埃氏筛法找出所有的质数
void is_Prime(int n)
{
	memset(arr, true, sizeof(arr));			
	arr[1] = false;//1不是素数
	for (int i = 2;i * i <= n;i++)
	{
		if (arr[i])	//把所有素数的倍数都不可能是素数	
		{	
			for (int j = 2;j * i <= n;j++)//从i*2开始,然后i*3..
				arr[j * i] = false;
		}
	}
	
}
//判断是否为回文数
bool huiwen(int n){
    int hui[8]={};//最大可能是八位
    for(int i=0;i<8;i++,n/=10){
        hui[7-i]=n%10;//讲该数正序存储到数组当中
    }
    int j;
    q.clear();
    //当该数小于8位时,去掉前面的无用0
    for(j=0;hui[j]==0;j++);
    for(int k=j;k<8;k++){
        q.push_back(hui[k]);//将该数各个位上的数存到q里
    }
    int len=q.size();
    for(int x=0;x<len/2;x++){
        if(q[x]!=q[len-1-x]) return false;
    }
    return true;
}
int main(){
    int a,b;
    cin>>a>>b;
    if(a%2==0)a++;//奇数不可能会是质数
    if(b>=10000000) b=9999999;//10000000之后没有回文数,这样可以降低O
    is_Prime(b);
    //下面这里+=2是因为这样可以直接去掉偶数的判断,偶数不可能是质数
    for(int i=a;i<=b;i+=2){
        if(arr[i]&&huiwen(i)) cout<<i<<endl;
    }
    
}
memset(arr, true, sizeof(arr));	

memset(arr, true, sizeof(arr)) 是一个用于将内存块的值设置为指定值的函数。在这里,它的作用是将数组 arr 的所有元素设置为 true。

具体来说,memset 函数的第一个参数是目标内存块的指针,第二个参数是要设置的值,第三个参数是要设置的内存块的大小。sizeof(arr) 表示数组 arr 的大小(以字节为单位)。

所以,memset(arr, true, sizeof(arr)) 的意思是将数组 arr 的所有元素设置为 true,也就是将所有元素初始化为 true。在这段代码中,它的作用可能是用来初始化布尔数组 arr,确保所有元素的初始值都为 true。

if (a % 2 == 0) a++;

在以上代码中,if (a % 2 == 0) a++; 是为了确保起始数a是奇数。这是因为题目要求在范围 [a, b] 内找到所有回文质数,而回文数一定是个位数为奇数的数字。

通过这个判断,如果 a 是偶数,则将其增加1,使其成为下一个奇数。这样可以确保起始数a是奇数,从而在循环中以步长为2递增,只考虑奇数,避免了对偶数进行不必要的判断。

因为偶数(除了2)一定不是质数,所以在查找回文质数的过程中,我们可以直接从奇数开始遍历,提高效率。

vector<int> q; 

vector q; 是定义了一个名为 q 的整型向量(vector)。这个向量可以存储一组整数,并根据需要动态调整大小。

q.clear(); 

q.clear(); 是向量 q 的成员函数,用于清空向量中的元素。它将向量的大小设置为0,即移除所有元素,使向量为空。

在上述代码中,q 被用作临时存储回文数的容器。在 huiwen() 函数中,回文数的每一位数字被存储在 q 中,然后进行回文数的判断。在每次判断完成后,通过 q.clear() 清空 q,以便存储下一个回文数的数字。这样可以确保每次判断都是基于当前回文数的数字集合,避免与上一次的结果冲突。

q.push_back(s[j]);

q.push_back(s[j]); 是向向量 q 的末尾添加一个新的元素。在这里,s[j] 表示将 s 数组中索引为 j 的元素添加到向量 q 的末尾。

int size = q.size();

q.size() 是返回向量 q 的当前大小(即元素的个数)。在这里,q.size() 用于确定回文数的位数,以便进行回文性检查。

总结:
q.push_back(s[j]); 是向向量 q 添加一个元素。
q.size() 是返回向量 q 的大小(元素个数)。

第n小的质数

在这里插入图片描述

#include<iostream>
using namespace std;

int main() {
    long long int sum = 1, i, j, n;  // 定义变量a、b、c、i、j、n、k,其中n表示要求的第n小的质数
    cin >> n;  // 输入一个正整数n

    if (n == 1)  // 如果n等于1
        cout << 2;  // 输出2,2是第一个质数
    else {
        for (i = 3;; i += 2) {  // 从3开始循环,每次加2,因为偶数(除了2)不可能是质数
            for (j = 3; j < i; j += 2) {  // 内层循环从3开始,每次加2,判断i是否可以被k整除
                if (i % j == 0)  // 如果i能被k整除
                    break;  // 跳出内层循环,说明i不是质数
                if (j * j > i)  // 如果k的平方大于i
                    break;  // 跳出内层循环,说明i是质数
            }
            if (j * j > i)  // 如果k的平方大于i
                sum++;  // 质数计数器a加1
            if (sum == n) {  // 如果质数计数器a等于n
                cout << i;  // 输出第n小的质数i
                return 0;  // 程序结束
            }
        }
    }
    return 0;
}

在质数判断的算法中,当一个数大于其平方根时,它一定不会有除了1和自身以外的因数。

在这段代码中,k * k > i 的条件检查是为了判断是否已经找到了当前数 i 的所有可能因数。在内层循环中,从 k 开始递增,当 k 的平方超过 i 时,就意味着在 k 的范围内已经找不到能整除 i 的因数了。

如果 k * k > i 成立,即 k 的平方大于 i,那么 i 不会被 k 之后的数整除,因此可以确定 i 是一个质数。

素数个数

在这里插入图片描述
第一种方法:埃氏筛质数

#include<iostream>
using namespace std;
#define maxn 50000
int prime[maxn];
int main(){
	int n,sum=0;
	cin>>n;
	prime[1]=1;
	for(int i=2;i<maxn;i++){
		if(prime[i]) continue;
		for(int j=i+i;j<maxn;j+=i){
			prime[j]=1;
		}
	}
	for(int i=2;i<=n;i++){
		if(prime[i]==0) sum++;
	}
	cout<<sum;
	return 0;
}

第二种方法:线性筛法
埃筛有个问题数字60,会被质数2、3、5分别标记一下,运行速度会降低一点。如何避免这种情况,如何提高时间效率为O(n)?
将每个合数用它的最小质因数筛除因此每个数只会被标记一次,时间复杂度是O(n)

#include<iostream>
using namespace std;

int prime[50000], p[50000], cnt;
// prime[] - 用于存储数字是否为素数的数组
// p[] - 用于存储素数的数组
// cnt - 计数变量,用于记录素数的个数

int count(int n) {
    prime[1] = 1;
    // 初始化 prime[1] 为 1,因为 1 不是素数

    for (int i = 2; i <= n; i++) {
        if (prime[i] == 0)
            p[++cnt] = i;
        // 如果 prime[i] 为 0,表示 i 是素数,将其存储到 p[] 数组中,并增加计数器

        for (int j = 1; j <= cnt && i * p[j] <= n; j++) {
            prime[i * p[j]] = 1;
            // 将 i * p[j] 标记为非素数,将 prime[i * p[j]] 设为 1

            if (i % p[j] == 0)
                break;
            // 如果 i 可以被 p[j] 整除,无需继续内循环
        }
    }
    return cnt;
    // 返回素数的个数
}

int main() {
    int n;
    cin >> n;
    cout << count(n);
    // 读取输入的 n,调用 count 函数计算素数的个数,并输出结果
}
if (i % p[j] == 0)
     break;
    // 如果 i 可以被 p[j] 整除,无需继续内循环
}

当在内循环中发现 i 可以被 p[j] 整除时,我们可以确定 i 不是一个素数。因为 i 是从小到大遍历的,而 p[j] 是小于或等于 i 的素数。

如果 i 能够被 p[j] 整除,那么它一定也能够被其他比 p[j] 更小的素数整除。如果我们继续在内循环中检查 i 能否被比 p[j] 更大的素数整除,这是多余的,因为我们已经找到了一个能够整除 i 的最小素数 p[j]。

因此,如果 i 能够被 p[j] 整除,我们可以断定 i 不是素数,并且终止内循环,以节省计算时间。这样可以提高算法的效率,避免重复的检查。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/517734.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

详解软件开发的标准过程(生命周期):跟着标准搞,设计没烦恼

目录 一.软件开发的生命周期总括 二.项目架构分类 C/S架构 B/S架构 三.详解软件需求 需求分类 需求获取 需求分析 四.详解面向对象分析&#xff08;OOA&#xff09; 概念理解&#xff1a; 统⼀建模语⾔UML UML的重要组成部分&#xff1a; ⽤例图的元素 识别参与者…

怎么搭建个人小型渲染农场?搭建渲染农场配置

渲染农场是众多机器组成的渲染集群&#xff0c;通常用来渲染你的单帧效果图或动画项目&#xff0c;我们借助渲染农场的力量&#xff0c;可以满足3D项目交期时间迫在眉睫的需求&#xff0c;当你试着在自己的机器上渲染一个复杂的动画项目时&#xff0c;可能需要几十小时的等待时…

gdb与symbol符号表文件的调试

目录 1&#xff0c;剥离命令 2&#xff0c;gdbdebug 文件的调试 今天在调试程序的时候发现&#xff0c;在测试部测试的程序都是剥离了符号表的&#xff0c;导致用gdb无法调试&#xff0c;只有找到符号表文件才能继续gdb调试&#xff0c;好在符号表文件是和程序一起发布的。之…

浅谈作为程序员如何写好文档:了解读者

我作为从一名懵懂的实习生转变为工程师的工作经历中&#xff0c;伴随着技术经验的成长&#xff0c;也逐渐意识到了编写文档是知识和经验传递给其他人的最有效方式。通过文档&#xff0c;可以分享我的技术知识和最佳实践&#xff0c;使其他人更好地理解我的工作。在这里&#xf…

Postgres : 创建schema、创建表空间与指定用户权限

1. 创建新的Schema 要创建 PostgreSQL 中的一个新的 schema&#xff0c;并创建一个只有该 schema 权限的新用户&#xff0c;请按照以下步骤操作&#xff1a; &#xff08;1&#xff09;打开 PostgreSQL 客户端并连接到数据库服务器。 &#xff08;2&#xff09;创建一个新的…

如何在Oracle存储过程发生异常时获取out类型参数的值

Oracle存储过程关于在出现&#xff08;自定义/自带&#xff09;异常下out类型参数的获取问题的分析 ✈️ 场景: 有一些关于金额和时间的精确且量大的计算需要在存储过程中完成。存储过程中有一些自定义的异常。并且将在RAISE前通过out类型的参数将详细的异常原因返回。 但是在…

商业智能BI分析报表很慢是什么原因?应该如何优化?

当下&#xff0c;数据计算已成为了分析工作中必不可少的高频次操作之一&#xff0c;而且在大数据的发展背景下&#xff0c;应用性能往往关系着项目的成败&#xff0c;成为了大家最为关注的产品技术参数。那么我们先来分析一下BI分析表计算很慢的原因是什么&#xff0c;再对症下…

Microsoft Dynamics 365 Business Central 生产订单扣料的几种方法

学习目标&#xff1a; 掌握生产订单扣料的几种方法 学习内容&#xff1a; Forward flush by routing operation&#xff08;通过工序&#xff1a;向前扣料&#xff09;Backward flush by routing operation&#xff08;通过工序&#xff1a;向后扣料&#xff09;Forward flus…

Java-Redis持久化之RDB操作

Java-Redis持久化之RDB操作 1.为什么redis需要持久化&#xff1f;2.什么是RDB操作?3.请你用自己的话讲下RDB的过程?4.如何恢复rdb文件? 1.为什么redis需要持久化&#xff1f; Redis是内存数据库&#xff0c;如果不将内存数据库保存到磁盘&#xff0c;那么服务器进程退出&am…

匿名对象的特性和使用场景你知道吗?

目录 一、匿名对象的概念 二、单参数和多参数构造场景的匿名对象 ①只有一个参数的构造函数 ②多个参数的构造函数 三、使用匿名对象作为函数的参数的缺省值 四、只为调用类中的一个函数时 五、匿名对象的特性 1、匿名对象的生命周期只有一行 2、匿名对象具有常性 3、当匿…

今天去面一个点工,HR要我会数据库,Linux还有Python,这合理吗?

软件测试出路在哪&#xff1f; 业务编程&#xff01;&#xff01; 1、软件测试的变化趋势 变化趋势1&#xff1a; 功能测试是核心&#xff0c;但是价值降低 目前测试这个行业&#xff0c;还是有大量的点工。但是行业的进步&#xff0c;技术的创新&#xff0c;导致了企业的需求…

不用下载的网页版Axure在这里

作为一名产品经理&#xff0c;你一定需要一款能够帮助你更好更快地制作原型&#xff0c;更方便地和团队协作的软件。网页版Axure工具替代即时设计无需下载激活&#xff0c;就可免费使用。那么&#xff0c;Axure网页版工具替代即时设计是如何进行的呢&#xff1f; 首先&#xf…

【数据结构】双向带头循环链表

文章目录 一、什么是带头双向循环链表二、带头双向循环链表的实现&#xff08;一&#xff09;链表中结构体的声明&#xff08;二&#xff09;头节点的创建&#xff08;链表的初始化&#xff09;&#xff08;三&#xff09;新节点的创建&#xff08;四&#xff09;链表的尾插&am…

( 位运算 ) 231. 2 的幂 ——【Leetcode每日一题】

❓231. 2 的幂 难度&#xff1a;简单 给你一个整数 n&#xff0c;请你判断该整数是否是 2 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 如果存在一个整数 x 使得 n 2 x n 2^x n2x &#xff0c;则认为 n 是 2 的幂次方。 示例 1&…

软考高级架构师笔记1-计算机硬件

目录 1. 前言 & 更新2. CPU组成3. CPU的指令集:4.存储器5. 总线1. 前言 & 更新 注意:绪论不考,直接略过。 计算机硬件章节19-21年没考过,在22年真题考过磁盘调度,根据趋势分析,以后考的概率也不大,了解即可。 本节删掉了第一版中的编码、海明码等内容。 2. CP…

一篇文章搞定《Android异常处理》

------《Android异常处理》 异常种类&#xff08;简述&#xff09;编译时异常运行时异常 运行时的异常和崩溃受检时的异常第一种做法&#xff1a;第二种做法&#xff1a; 不受检时的异常(崩溃Crash)异常的传播崩溃的兜底Looper 循环问题主流程抛出异常问题 安全气囊的实现方案设…

计算机组成原理---第六章总线系统 习题详解版

&#xff08;一&#xff09;课内习题 &#xff08;二&#xff09;课后习题 1.比较单总线、多总线结构的性能特点。 答&#xff1a; &#xff08;1&#xff09; 单总线结构:它是用单一的系统总线连接整个计算 机系统的各大功能部件,各大部件之间的所有的信息传送都通过这组总线…

【企业信息化】第6集 免费开源ERP: Odoo 16 MRP + 维护+ PLM +质量全面生产制造管理

文章目录 一、MRP 物料需求计划1.一款软件&#xff0c;满足您的所有需要2.工作中心控制面板3.优化您的库存等级4.条形码&#xff0c;即开即用5.出色报告关键绩效指标6.与其他Odoo应用程序完全集成 二、PLM 产品生命周期管理1.管理工程变更2.集成文件管理3.智能版本管理4.与其他…

还在为项目初始化、依赖管理问题困扰?Dubbo Initializer 来了!

作者&#xff1a;Dubbo 社区 通过这篇文章&#xff0c;你将学习如何在 1 分钟内用 Dubbo Initializer 模板快速创建 Dubbo Spring Boot 项目&#xff0c;帮你解决项目初始化问题。 什么是 Dubbo Initializer&#xff1f; Dubbo Initializer 是一款帮助开发者快速生成 Dubbo …

【0基础也能学会】JMeter:如何开始简单的WEB压力测试?

背景 最近工作上被安排针对Web网站进行性能压测&#xff0c;以评估特定的硬件配置下Web网站可支持的并发用户数。考虑到JMeter是流行的Web性能压测工具&#xff0c;因此趁着这次机会上网查阅了很多关于JMeter的资料&#xff0c;也自己动手进行软件的配置和调测&#xff0c;从最…