完全数和质数算法详解

完全数是指一个正整数,它等于其所有真约数(即除了自身以外的所有正因数)之和。例如,6 是一个完全数,因为它的真约数是 1、2 和 3,且 1 + 2 + 3 = 6。

1 计算约数和

1.1 遍历

遍历其所有可能的约数并计算它们的和。如果和等于该数,则为完全数,否则不是。

#include <iostream>
using namespace std;int main() {int N;cin >> N;while (N--) {int X;cin >> X;int sum = 0;for (int i = 1; i * i <= X; ++i) {if (X % i == 0) {if (i != X) sum += i; int j = X / i;if (j != X && j != i) sum += j; }}cout << X << (sum == X ? " is" : " is not") << endl;}return 0;
}

1.2 生成表

#include <iostream>
#include <vector>
using namespace std;int main() {int N;cin >> N;vector<int> perfect = {6, 28, 496, 8128, 33550336}; while (N--) {int X;cin >> X;bool isPerfect = false;for (int num : perfect) {if (num == X) {isPerfect = true;break;}}cout << X << (isPerfect ? " is" : " is not") << endl;}return 0;
}

2 判断质数

2.1 错误解法 遍历

#include <iostream>
using namespace std;int main() {int n;cin >> n;for (int j = 1; j <= n; j++) {int x;bool is_prime = true;cin >> x;if (x == 1) cout << x << " is not" << endl;else {int i;for (i = 2; i < x; i++) {if (x % i == 0) {is_prime = false;break;} else is_prime = true;}if (is_prime) cout << x << " is" << endl;else cout << x << " is not" << endl;}}return 0;
}

时间复杂度:对于每个输入的数字 x x x,内层循环从 2 2 2 x − 1 x-1 x1 遍历,因此单次判定的时间复杂度为 O ( x ) O(x) O(x)。如果需要判断 N N N 个数字,则总时间复杂度为 O ( N ⋅ X ) O(N \cdot X) O(NX),其中 X X X 是输入数字的最大值。当 X X X 较大(例如 1 0 9 10^9 109)时,通常会TLE


2.2 正确解法

根据数学原理,一个数 x x x 如果不是质数,那么它一定可以分解为两个因数 a a a b b b,且至少有一个因数小于等于 x \sqrt{x} x 。因此,我们只需要检查从 2 2 2 x \sqrt{x} x 的所有整数即可。

#include <iostream>
using namespace std;int main() {int n;cin >> n;while (n--) {int x;bool is_prime = true;cin >> x;if (x == 1) cout << x << " is not " << endl;else {int i;for (i = 2; i <= x / i; i++) {if (x % i == 0) {is_prime = false;break;}}if (is_prime) cout << x << " is " << endl;else cout << x << " is not " << endl;}}return 0;
}

时间复杂度: 对于每个数字 x x x,只需检查从 2 2 2 x \sqrt{x} x 的所有整数,因此单次判定的时间复杂度为 O ( x ) O(\sqrt{x}) O(x )。如果需要判断 N N N 个数字,则总时间复杂度为 O ( N ⋅ X ) O(N \cdot \sqrt{X}) O(NX ),其中 X X X 是输入数字的最大值。


为什么只需要检查到 x \sqrt{x} x

如果一个数 x x x不是质数,那么它一定可以分解为两个因数 a a a b b b,且至少有一个因数小于或等于 x \sqrt{x} x

一个数 x x x合数(非质数),意味着它可以被分解为两个整数的乘积: x = a ⋅ b x=a\cdot b x=ab,其中 a a a b b b都是大于1的整数。如果 x x x是质数,则它无法被任何小于 x x x的正整数整除(除了1和自身)。

假设 x x x是一个合数,那么它可以写成两个因数的乘积:
x = a ⋅ b x=a\cdot b x=ab
其中 a a a b b b都是正整数,且 a ≤ b a\leq b ab(为了简化讨论,我们可以假设 a a a是较小的那个因数)。
a ⋅ b = x ⟹ a ≤ x 或 b ≤ x a\cdot b=x\implies a\leq\sqrt{x}\quad\text{或}\quad b\leq\sqrt{x} ab=xax bx

因为如果 a > x a>\sqrt{x} a>x b > x b>\sqrt{x} b>x ,那么 a ⋅ b > x ⋅ x = x a\cdot b>\sqrt{x}\cdot\sqrt{x}=x ab>x x =x,这与 a ⋅ b = x a\cdot b=x ab=x矛盾。因此,至少有一个因数 a a a b b b满足 a ≤ x a\leq\sqrt{x} ax b ≤ x b\leq\sqrt{x} bx 。换句话说,如果 x x x是合数,那么它一定存在一个小于或等于 x \sqrt{x} x 的因数。


反证法:

如果 x x x是合数,则它一定存在一个小于或等于 x \sqrt{x} x 的因数。

证明

  1. 假设 x x x是合数,且 x x x的所有因数都大于 x \sqrt{x} x
  2. x = a ⋅ b x=a\cdot b x=ab,其中 a a a b b b都是大于 x \sqrt{x} x 的整数。
  3. 根据假设, a > x a>\sqrt{x} a>x b > x b>\sqrt{x} b>x
  4. 因此, a ⋅ b > x ⋅ x = x a\cdot b>\sqrt{x}\cdot\sqrt{x}=x ab>x x =x,这与 x = a ⋅ b x=a\cdot b x=ab矛盾。
  5. 故假设不成立,即 x x x至少存在一个小于或等于 x \sqrt{x} x 的因数。

示例分析:

正例 x = 36 x=36 x=36

36 = 6 ⋅ 6 36=6\cdot6 36=66,其中 6 = 36 6=\sqrt{36} 6=36 。所有因数对为 ( 1 , 36 ) , ( 2 , 18 ) , ( 3 , 12 ) , ( 4 , 9 ) , ( 6 , 6 ) (1,36),(2,18),(3,12),(4,9),(6,6) (1,36),(2,18),(3,12),(4,9),(6,6)。只需要检查 2 , 3 , 4 , 5 , 6 2,3,4,5,6 2,3,4,5,6即可找到因数。

反例 x = 73 x=73 x=73

73 73 73是质数,无法分解为两个整数的乘积。检查 2 , 3 , 4 , 5 , 6 , 7 , 8 2,3,4,5,6,7,8 2,3,4,5,6,7,8后发现 73 73 73无法被整除。

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

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

相关文章

buu-jarvisoj_level2_x64-好久不见37

覆盖缓冲区和 RBP&#xff1a; 使用 128 8 字节覆盖 buf 和 rbp。 构造 ROP 链&#xff1a; pop rdi; ret 地址&#xff1a; 将 pop rdi; ret 指令的地址写入返回地址位置。 /bin/sh 地址&#xff1a; 将 /bin/sh 字符串的地址压入栈顶&#xff0c;作为 system 函数的参数。…

大模型训练为什么依赖GPU

近年来&#xff0c;随着人工智能技术的飞速发展&#xff0c;特别是深度学习领域的进步&#xff0c;大模型的训练逐渐成为研究和工业界的热点。作为大模型训练中的核心硬件&#xff0c;GPU&#xff08;图形处理单元&#xff09;扮演了至关重要的角色。那么&#xff0c;为什么大模…

Python的那些事第二十一篇:Python Web开发的“秘密武器”Flask

基于 Flask 框架的 Python Web 开发研究 摘要 在 Web 开发的江湖里,Python 是一位武林高手,而 Flask 则是它手中那把小巧却锋利的匕首。本文以 Flask 框架为核心,深入探讨了它在 Python Web 开发中的应用。通过幽默风趣的笔触,结合实例和表格,分析了 Flask 的特性、优势以…

Ubuntu+Laravel+MQ+Supervisor队列系统搭建流程

1、安装MQ环境 sudo apt install -y rabbitmq-server sudo systemctl enable rabbitmq-server --now 2、进入laravel项目&#xff0c;安装MQ队列驱动 composer require vladimir-yuldashev/laravel-queue-rabbitmq 3、配置 .env QUEUE_CONNECTIONrabbitmq RABBITMQ_HOST12…

5G与物联网的协同发展:打造智能城市的未来

引言 随着科技的不断进步&#xff0c;智能城市的概念已经不再是科幻小说中的幻想&#xff0c;它正在逐步走进我们的生活。而这背后的两大驱动力无疑是 5G和 物联网&#xff08;IoT&#xff09;。5G网络以其高速率、低延迟、大容量的优势&#xff0c;与物联网的强大连接能力相结…

python第七课

WSGI Middleware 中间件&#xff0c;可以理解称对应用程序的一组装饰器&#xff0c;对两边都起作用的元素。 重写environ&#xff0c;然后基于URL&#xff0c;将请求对象路由给不同的应用对象支持多个应用或者框架顺序地运行于同一个进程中通过转发请求和相应&#xff0c;支持负…

RAII(Resource Acquisition Is Initialization)机制

RAII&#xff08;Resource Acquisition Is Initialization&#xff09;机制 1. 什么是 RAII&#xff1f; &#x1f31f; RAII&#xff08;资源获取即初始化&#xff0c;Resource Acquisition Is Initialization&#xff09; 是 C 语言中的一种管理资源的编程技巧。 RAII 使资…

【kafka系列】日志存储设计 消息写入、读取

目录 日志存储设计 1. 日志存储的目录结构 2. 日志内容格式设计 3. 日志索引设计 4. 设计优势 消息写入流程 示例 流程图 消息读取流程 示例 关键设计细节 流程图 日志存储设计 Kafka的日志存储是其高吞吐、持久化能力的核心设计&#xff0c;其结构包含目录组织、…

vue3.x 自定义hook函数详细解读

1. 什么是自定义 Hook 函数&#xff1f; 自定义 Hook 函数是一个封装了逻辑的 JavaScript 函数&#xff0c;它可以使用 Vue 3 的 Composition API 提供的响应式数据和生命周期钩子。通过自定义 Hook&#xff0c;你可以将组件的逻辑拆分成更小、更可复用的单元。 特点&#xf…

是时候说再见了

说再见 2018 to 2025 2018&#xff1a;学习 2018年开始读研。师兄师姐们说可以写写CSDN博客&#xff0c;对找工作也有帮助。于是在12月4日&#xff0c;发布了自己的第一篇文章[翻译] 神经网络与深度学习 首页 - Index。当时还在学习各种基础知识&#xff0c;看到了这个英文文…

蓝桥杯篇---IAP15F2K61S2定时器

文章目录 前言简介定时器的工作模式1.模式02.模式13.模式24.模式3 定时器的寄存器1.TMOD2.TCON3.THO/TL04.TH1/TL1 定时器的使用步骤1.配置TMOD2.设置初值3.启动定时器4.使能中断5.编写中断服务函数 示例代码&#xff1a;定时器的基本使用代码说明示例代码&#xff1a;定时器1用…

2D 游戏艺术、动画和光照

原文&#xff1a;https://unity.com/resources/2d-game-art-animation-lighting-for-artists-ebook 笔记 用Tilemap瓷砖大小为1单元&#xff0c;人物大小在0.5~2单元 PPU &#xff1a;单位像素 pixels per unit 2160 4K分辨率/ 正交相机size*2 完整屏幕显示像素点 有骨骼动…

HTML的入门

一、HTML HTML&#xff08;HyperText Markup Language&#xff0c;超文本标记语言&#xff09;是一种用来告知浏览器如何组织页面的标记语言。 超文本&#xff1a;就是超越了文本&#xff1b;HTML不仅仅可以用来显示文本(字符串、数字之类)&#xff0c;还可以显示视频、音频等…

C语言:指针详解

C语言&#xff1a;指针详解 1&#xff1a;指针的基本概念1&#xff1a;什么是指针2&#xff1a;为什么要引入指针3&#xff1a;指针的作用4&#xff1a;指针的类型 2&#xff1a;指针的声明与初始化1&#xff1a; 指针的声明2&#xff1a; 指针的初始化 3&#xff1a;指针的操作…

Spring Boot “约定大于配置”

什么是“约定大于配置”&#xff1f; “约定大于配置”是一种简化开发的设计理念。简单来说&#xff0c;就是框架默认提供了常见的配置和行为&#xff0c;开发者只需要按照约定来编写代码&#xff0c;避免了繁琐的配置&#xff0c;只在需要时进行定制和调整。这种理念在Spring…

redis sentinel模式 与 redis 分片集群 配置

Redis 最低为5.0版本&#xff0c;以下为6.2.6版本信息。 模式 高可用性 数据分片 部署复杂度 适用场景 Sentinel 模式 高 无 中等 中小规模&#xff0c;需要高可用性 集群模式 高 支持 复杂 大规模&#xff0c;需要高…

HCIA项目实践---OSPF的基本配置

9.5.12 OSPF的基本配置 &#xff08;所搭环境如上图所示&#xff09; A 先配置IP地址 (先进入路由器R1的0/0/0接口配置IP地址&#xff0c;再进入环回接口配置IP地址) &#xff08;配置R2路由器的0/0/0和0/0/1以及环回接口的IP地址&#xff09; &#xff08;置R3路由器的0/0/0接…

【MyBatis】预编译SQL与即时SQL

目录 1. 以基本类型参数为例测试#{ }与${ }传递参数的区别 1.1 参数为Integer类型 1.2 参数为String类型 2. 使用#{ }传参存在的问题 2.1 参数为排序方式 2.2 模糊查询 3. 使用${ }传参存在的问题 3.1 SQL注入 3.2 对比#{ } 与 ${ }在SQL注入方面存在的问题 3.3 预编译…

07:串口通信(二):收发数据包

1、数据包 我们使用上位机个单片机发送数据包时&#xff0c;规定包头和包尾&#xff0c;将我们需要发送的数据放在中间&#xff0c;数据的长度我们也可以自己规定。一般情况下HEX数据包我们使用固定长度数据包。而文本数据包使用是可变长度数据包。 2、HEX数据包 2.1、HEX固定…

vs2022支持.netframework4.0

下载nuget包 .netframework4.0 解压nuget 复制到C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework 参考 https://www.cnblogs.com/bdqczhl/p/18670152 https://blog.csdn.net/xiaomeng1998_/article/details/135979884