C++知识点总结(11):质因子分解

一、质数和合数

质数

如果一个数除了 1 1 1 和本身,没有其他的因数,就是质数。

合数

如果一个数除了 1 1 1 和本身,还有其他的因数,就是合数。

小贴士

1 1 1 是一个例外,既不是质数,也不是合数。

二、求质数程序

#include <iostream>
using namespace std;int main()
{int n;cin >> n;bool flag = true; // 默认 n 是质数for (int i = 2; i <= sqrt(n); i++){if (n % i == 0) // 如果 n 能整除 i {flag = false; // 标注 n 不是质数break; // 跳出循环,因为已经知道 n 不是质数了}}
}

三、分解质因数

每个合数都可以写成几个质数相乘的形式,其中每个质数都是这个合数的因数,把每个质数都是这个合数的因数,把一个合数用质因数相乘的形式表示出来,叫做分解质因数。

有一种快速的分解质因数的方法,叫做短除法。简单来说,短除法就是不断地用最小的质因数除以它本身。

步骤公式
1 100 ÷ 2 = 50 100 \div 2 = 50 100÷2=50
2 50 ÷ 2 = 25 50 \div 2 = 25 50÷2=25
3 25 ÷ 5 = 5 25 \div 5 = 5 25÷5=5
4 5 ÷ 5 = 1 5 \div 5 = 1 5÷5=1

1. 初步推导

#include <iostream>
using namespace std;int main()
{// 输入 int n;cin >> n;// 分解质因数for (int i = 2; i <= n; i++){while (n % i == 0){cout << i << " ";n /= i;}}return 0;
}

程序问题:运行超时。

2. 完善(1)

#include <iostream>
#include <cmath>
using namespace std;int main()
{// 输入 int n;cin >> n;// 分解质因数for (int i = 2; i <= sqrt(n); i++){while (n % i == 0){cout << i << " ";n /= i;}}return 0;
}

程序问题:未遍历到 n n n 本身,然而在 n n n 是质数的情况下, n n n 这个数字本身也是 n n n 的质因数。

3. 完善(2)

#include <iostream>
#include <cmath>
using namespace std;int main()
{// 输入 int n;cin >> n;// 分解质因数for (int i = 2; i <= sqrt(n); i++){while (n % i == 0){cout << i << " ";n /= i;}}// 特例cout << n;return 0;
}

程序问题: n n n 有可能是 1 1 1 ,然而 1 1 1 是一个例外,既不是质数,也不是合数。

4. 最终代码

#include <iostream>
#include <cmath>
using namespace std;int main()
{// 输入 int n;cin >> n;// 分解质因数for (int i = 2; i <= sqrt(n); i++){while (n % i == 0){cout << i << " ";n /= i;}}// 特例if (n > 1){cout << n;}return 0;
}

四、因数个数

由于输入的数字可能会超过 l o n g long long l o n g long long 的上限,为了保证万无一失,我们来找一找因数和质因数之间的关系。

100 100 100 举个例子。

因数等价于
1 1 1 2 0 × 5 0 2^0 \times 5^0 20×50
2 2 2 2 1 × 5 0 2^1 \times 5^0 21×50
4 4 4 2 2 × 5 0 2^2 \times 5^0 22×50
5 5 5 2 0 × 5 1 2^0 \times 5^1 20×51
10 10 10 2 1 × 5 1 2^1 \times 5^1 21×51
20 20 20 2 2 × 5 1 2^2 \times 5^1 22×51
25 25 25 2 0 × 5 2 2^0 \times 5^2 20×52
50 50 50 2 1 × 5 2 2^1 \times 5^2 21×52
100 100 100 2 2 × 5 2 2^2 \times 5^2 22×52

这样,我们写出代码:

#include <iostream>
#include <cmath>
using namespace std;int main()
{// 输入 long long n;cin >> n;// 分解质因数long long cnt;long long ans = 1; // 最终所有因数的个数 for (long long i = 2; i <= sqrt(n); i++){cnt = 0;while (n % i == 0){cnt++;n /= i;}ans *= (cnt+1); }// 特例if (n > 1){ans *= 2;}// 输出cout << ans; return 0;
}

五、数字游戏

题目描述

小明现在在进行一个数字游戏。在游戏中,给定一个初始数,可以对数字做以下两种操作任意次:
1、将数乘上任意一个非 0 0 0 正整数。
2、如果这个数是一个完全平方数,给它开根号。
现在小明想知道,在经过一系列操作以后,这个数最小可以变成多少?

输入描述

输入共一行,包含一个整数 n n n 2 ≤ n ≤ 5 × 1 0 8 2 \leq n \leq 5 \times 10^8 2n5×108),表示初始数。

输出描述

输出一个整数,表示游戏过程中数最小可以变成多少。

样例1

输入

100

输出

10

样例解释

直接将100开根号,可以得到10。

参考代码

#include <iostream>
#include <cmath>
using namespace std;int main()
{// 输入 int n;cin >> n;// 分解质因数int ans = 1;for (int i = 2; i <= sqrt(n); i++){if (n % i == 0) // n 是质因数的时候{ans *= i;}while (n % i == 0){n /= i;}}// 特例if (n > 1){ans *= n; // n 是一个新的质因数 }return 0;
}

代码思路:

  1. 输入一个整数n
  2. 通过一个for循环从2开始遍历到sqrt(n),如果n可以被i整除,则表明i是n的一个质因数,将其乘到ans中
  3. 通过一个while循环将n不断除以i,直到不能整除为止
  4. 如果n大于1,则说明剩下的n是一个新的质因数,将其乘到ans中。

六、数组游戏Ⅱ

题目描述

小明现在在进行一个数字游戏。在游戏中,给定一个初始数n,可以对数做以下操作任意次:
1、选择一个形如 x = p k x=p^k x=pk 且是该数是 n n n 的因数,其中 p p p 是一个质数, k ≥ 1 k \geq 1 k1,将 n ÷ x n \div x n÷x
2、每次选取的数需要互不相同。
现在小明想知道,最多可以进行多少次这样的操作呢?

输入描述

输入共一行,包含一个整数 n n n 2 ≤ n ≤ 5 × 1 0 7 2 \leq n \leq 5 \times 10^7 2n5×107),表示初始数。

输出描述

输出一个整数,表示游戏过程中最多可以进行多少次操作。

样例1

输入

500

输出

3

样例解释

可以将 500 500 500 先除以 5 5 5 ,再除以 25 25 25 ,再除以 2 2 2 ,共执行 3 3 3 次。

参考代码

#include <iostream>
#include <cmath>
using namespace std;int main()
{// 输入 int n;cin >> n;// 分解质因数int cnt;int k;int ans = 0;for (int i = 2; i <= sqrt(n); i++){cnt = 0;k = 1;while (n % i == 0){cnt++;n /= i;}while (k <= cnt){cnt -= k;k++;}ans += (k-1);}// 特例if (n > 1){ans += 1;}cout << ans;return 0;
}

代码详解

行数功能
8~9输入一个整数 n n n
12 c n t cnt cnt 用来记录当前质因数的个数
13 k k k 用来记录操作次数
14 a n s ans ans 用来记录总操作次数
15通过一个 f o r for for 循环从 2 2 2 开始遍历到 s q r t ( n ) sqrt(n) sqrt(n)
17通过一个 w h i l e while while 循环将 n n n 不断除以 i i i ,直到不能整除为止
19~23记录下除以 i i i 的次数,并累加到 c n t cnt cnt
24通过另一个 w h i l e while while 循环
26~27 1 1 1 c n t cnt cnt 遍历,每次将 k k k 累加,并将 c n t cnt cnt 减去k,直到 c n t cnt cnt 小于等于 0 0 0 为止
29将最大操作次数加到 a n s ans ans 中( k − 1 k-1 k1 就是当前质因数可以进行的最大操作次数)
33~36如果 n > 1 n>1 n>1,则说明剩下的 n n n 是一个新的质因数,将操作次数 + 1 +1 +1
37 a n s ans ans 即游戏过程中最多可以进行的操作次数

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

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

相关文章

linux安装python

文章目录 前言一、下载安装包二、安装1.安装依赖2.解压3.安装4.软链接5.验证 总结 前言 本篇文章介绍linux环境下安装python。 一、下载安装包 下载地址&#xff1a;官方网站 我们以最新的标准版为例 二、安装 1.安装依赖 yum -y install openssl-devel ncurses-devel li…

3.pytorch cifar10

数据集 CIFAR10 是由 Hinton 的学生 Alex Krizhevsky、Ilya Sutskever 收集的一个用于普适物体识别的计算机视觉数据集&#xff0c;它包含 60000 张 32 X 32 的 RGB 彩色图片&#xff0c;总共 10 个分类。 这些类别分别是飞机、汽车、鸟类、猫、鹿、狗、青蛙、马、船和卡车。其…

服务号和订阅号哪个好

服务号和订阅号有什么区别&#xff1f;服务号转为订阅号有哪些作用&#xff1f;在推送频率上来看&#xff0c;服务号每月能推送四条消息&#xff0c;而订阅号可以每天&#xff08;24小时&#xff09;推送一条消息。如果企业开通公众号的目的是提供服务&#xff0c;例如售前资讯…

动态规划 | 鸡蛋问题 | 元旦假期来点“蛋”题

文章目录 鸡蛋掉落 - 两枚鸡蛋题目描述动态规划解法问题分析程序代码 鸡蛋掉落题目描述问题分析程序代码复杂度分析 鸡蛋掉落 - 两枚鸡蛋 题目描述 原题链接 给你 2 枚相同 的鸡蛋&#xff0c;和一栋从第 1 层到第 n 层共有 n 层楼的建筑。 已知存在楼层 f &#xff0c;满足 …

我的学习C#回炉学习日志——Lua热更新06_模块

模块 个人理解&#xff1a;lua的包比起C#&#xff0c;基本上就是一个table记录所有信息&#xff0c;包括变量、常量等 module {} module.constant "一个常量" function module.func1()io.write("一个共有函数\n") endlocal function func2()-- bodypr…

C语言注释的使用与理解

什么是注释&#xff1f; 在编程中&#xff0c;注释&#xff08;Comment&#xff09;是一种非执行文本&#xff0c;它用于为代码提供解释、说明和文档。注释的内容不参与程序的实际编译和运行过程&#xff0c;其主要目的是提高代码的可读性和可维护性&#xff0c;方便开发者以及…

MySQL:排序和分组

1、排序 order by 用于对结果集按照一个列或者多个列进行排序。默认按照升序对记录进行排序&#xff0c;如果需要按照降序对记录进行排序&#xff0c;可以使用 desc 关键字。 order by 对多列排序的时候&#xff0c;先排序的列放前面&#xff0c;后排序的列放后面。并且&…

Python字典类型key找value或者value找key方法汇总

字典中&#xff0c;如何通过唯一的value获取key 如果传入的值在字典的值中不存在&#xff0c;可以返回一个特定的默认值或者抛出一个异常来表示该情况。以下是两种处理方式的示例&#xff1a; 返回默认值&#xff1a; def get_key_by_value(dictionary, value, defaultNone)…

JavaScript:函数隐含对象arguments/剩余参数. . .c/解构赋值

除了this&#xff0c;在函数内部还存在着一个隐含的参数arguments arguments 是一个类数组对象&#xff08;伪数组&#xff09; 调用函数时传递的所有实参&#xff0c;都被存储在arguments中 arguments[0] 表示的是第一个实参 arguments[1] 表示的是第二个实参 以此类推..…

2022年全球运维大会(GOPS深圳站)-核心PPT资料下载

一、峰会简介 GOPS 主要面向运维行业的中高端技术人员&#xff0c;包括运维、开发、测试、架构师等群体。目的在于帮助IT技术从业者系统学习了解相关知识体系&#xff0c;让创新技术推动社会进步。您将会看到国内外知名企业的相关技术案例&#xff0c;也能与国内顶尖的技术专家…

【数据结构】链式家族的成员——循环链表与静态链表

循环链表与静态链表 导言一、循环链表1.1 循环单链表1.2 循环双链表 二、静态链表2.1 静态链表的创建2.2 静态链表的初始化2.3 小结 结语 导言 大家好&#xff01;很高兴又和大家见面啦&#xff01;&#xff01;&#xff01; 经过前面的介绍&#xff0c;相信大家对链式家族的…

软件测试/测试开发丨Mac Appium环境搭建

Mac 上 Appium 环境搭建 安装 nodejs 与 npm 安装方式与 windows 类似 &#xff0c;官网下载对应的 mac 版本的安装包&#xff0c;双击即可安装&#xff0c;无须配置环境变量。官方下载地址&#xff1a;https://nodejs.org/en/download/ 安装 appium Appium 分为两个版本&a…

【Transformer】深入理解Transformer模型1——初步认识了解

前言 Transformer模型出自论文&#xff1a;《Attention is All You Need》 2017年 近年来&#xff0c;在自然语言处理领域和图像处理领域&#xff0c;Transformer模型都受到了极为广泛的关注&#xff0c;很多模型中都用到了Transformer或者是Transformer模型的变体&#xff0…

ElasticSearch--基本操作

ElasticSearch 完成ES安装 http://101.42.93.208:5601/app/dev_tools#/console 库的操作 创建索引库 请求方式&#xff1a;PUT 请求路径&#xff1a;/索引库名&#xff0c;可以自定义 请求参数&#xff1a;mapping映射 PUT /test {"mappings": {"propertie…

计算机硬件 4.3显示器

第三节 显示器 一、基本概念 1.定义&#xff1a;将电信号转换为可以直接看到的图像的最基本输出设备。 2.分类&#xff1a;按显示色彩分&#xff1a;单色显示器、彩色显示器。 按显示原理分&#xff1a;CRT显示器、LCD显示器、LED显示器、OLED显示器。 3.原理结构&#xff…

【Oracle】 Oracle Sequence 性能优化

Sequence是很简单的&#xff0c;如果最大程度利用默认值的话&#xff0c;我们只需要定义sequence对象的名字即可。在序列Sequence对象的定义中&#xff0c;Cache是一个可选择的参数。默认的Sequence对象是有cache选项的&#xff0c;默认取值为20。这个默认值对于大多数情况下都…

云原生|kubernetes|kubernetes资源备份和集群迁移神器velero的部署和使用

前言&#xff1a; kubernetes集群需要灾备吗&#xff1f;kubernetes需要迁移吗&#xff1f; 答案肯定是需要的 那么&#xff0c;如何做kubernetes灾备和迁移呢&#xff1f;当然了&#xff0c;有很多的方法&#xff0c;例如&#xff0c;自己编写shell脚本&#xff0c;或者使用…

2023年江苏省职业院校技能大赛高职组“软件测试”赛项接口测试答案报告(含术语)

2023年江苏省职业院校技能大赛高职组“软件测试”赛项接口测试答案报告 接口测试要求: 1、执行接口测试 本部分按照软件接口测试文档要求,执行接口测试;使用接口测试工具PostMan,编写脚本、配置参数、执行接口测试并且截图。截图需粘贴在接口测试总结报告中。接口测试具体…

06-C++ 模板

模板、类型转换 模板 1. 简介 一种用于实现 通用编程 的机制。 将 数据类型 可以作为参数进行传递 。 通过使用模板&#xff0c;我们可以编写可复用的代码&#xff0c;可以适用于多种数据类型。 c模板的语法使用尖括号 < > 来表示泛型类型&#xff0c;并使用关键字…

啊?这也算事务?!

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…