算法日记23:SC16+17(求数的因子+质因子)

题目1: 求解因子

在这里插入图片描述

题解1:

1)易得,当 n = a ∗ b n=a*b n=ab时, a , b {a,b} a,b是n的因子(假设 a < b a<b a<b)

  • 可以发现只需枚举到即可 n \sqrt{n} n ,因为 a < = n < = b a<=\sqrt{n}<=b a<=n <=b
  • 且,我们通过 a a a可以直接得到b, b = n / a b=n/a b=n/a
    在这里插入图片描述

代码1:求解因子

#include<bits/stdc++.h>
using namespace std;typedef long long ll;void solve()
{ll n;cin>>n;vector<ll>v;for(ll i=1; i <= n / i;i++){//表明i不是n的因子if(n%i!=0) continue;//此时有i n/i两个因子//如果这两个因子相等if(i==n/i)  {v.push_back(i);}else {v.push_back(i);v.push_back(n/i);}}sort(v.begin(),v.end());for(auto &i:v){cout<<i<<' ';}
}int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int _=1;while(_--) solve();return 0;
}

题目2:求解质因子

在这里插入图片描述

题解2:

0)我们可以考虑把一个数给拆分成多个质因数以及其指数数相乘得到

在这里插入图片描述

1)首先,我们我们可以从2开始枚举数直到 n \sqrt{n} n ,并且不断去除其组成(也就是去除2、3、5)

在这里插入图片描述

2)并且在这个做法中,我们枚举的数一定是质数因为 i i i一定会被其质数给分解,

  • 假设 i = 4 i=4 i=4,且 n n n为偶数,那么 i = 4 i=4 i=4不会被整除,因为 n n n会被 2 2 2给消除完全偶数这个范围, n = 6 、 8 、 10..... n=6、8、10..... n=6810.....同理

3)总结:可以把一个数看作向量,随后我们拆分其各各方向上的值,并且他们一定不会相互干扰 (因为都为质数)

代码2:

1)代码分块解析

1. 定义类型

typedef long long ll;
  • typedef long long ll;:将 long long 类型定义为 ll,这样写更简洁。

2. solve 函数

void solve()
{ll n;cin >> n;
  • ll n; cin >> n;:读取输入值 n,即我们要进行质因子分解的整数。

3. for 循环开始

    vector<ll> v;for(ll i=2; i <= n / i;i++){//那么i一定会被其质数给分解,假设i==4//那么i==4不会被整除,因为i会被2给消除完全//表明i不是n的质因子if(n%i!=0) continue;//此时有i这个因子,且一定为质数,因为假如i不是质数//接下来把i除干净while(n%i==0)   //还能被i整除{n/=i;}v.push_back(i);}

这个 for 循环用于寻找 n 的所有质因子。让我们逐步理解它的意义。

3.1. 循环条件:i <= n / i
  • 循环范围i 从 2 开始,到 n / i 结束。为什么循环条件是 i <= n / i 呢?
    • i 是从 2 开始的,因为 1 不是质数,所以不需要考虑。
    • 质因子的性质决定了,我们只需要查找到 sqrt(n) 这个范围,因为任何大于 sqrt(n) 的因子,都会与小于 sqrt(n) 的因子一一对应。例如,若 n = 36,其因子对是 (2, 18), (3, 12), (4, 9), (6, 6),注意到 66 只是一个重复因子,因此只需要检查到 sqrt(n),即可获取所有因子。

例如,对于 n = 36

  • i 从 2 遍历到 sqrt(36) = 6,检查是否为因子。
3.2. if (n % i != 0) continue;
  • 这行判断 i 是否是 n 的因子。如果 i 不能整除 n,则 n % i != 0,此时跳过当前循环,进入下一个 i
3.3. 质因子分解:while (n % i == 0) n /= i;
  • 如果 in 的因子,即 n % i == 0,进入 while 循环。
  • 这时,while (n % i == 0) 会一直将 in 中除尽。即将 n 中所有的 i 因子消除,直到 n 不能再被 i 整除为止。
  • 例如,如果 n = 36i = 2,那么第一次 n /= 2 后,n 变为 18;第二次 n /= 2 后,n 变为 9;然后 n % 2 != 0,退出循环。
3.4. v.push_back(i);
  • i 被成功地用来除去 n 中的因子时,i 就是一个质因子,加入到 v 向量中。

4. 如果n本身就是一个质数,其没有质因子,因此我们需要特判

	//n本身就是质因子if (n > 1) v.push_back(n);
  • for 循环之后,如果 n > 1,说明 n 本身就是一个质数。因为如果 n2sqrt(n) 之间的所有数都整除,那么 n 已经变成了 1。如果 n 大于 1,说明它本身就是一个质因子,应该被加入到 v 中。

5. 排序和输出

    sort(v.begin(), v.end());for (auto &i : v){cout << i << ' ';}
  • sort(v.begin(), v.end());:对质因子进行排序。虽然质因子自然是递增的,但这里显式地排序以确保输出顺序。
  • for (auto &i : v):遍历 v 中存储的质因子,按顺序输出。

总结

这个代码的核心思想是通过 for 循环遍历所有可能的因子 i(从 2 到 sqrt(n)),并检查它们是否为 n 的因子。如果是,使用 while 循环将 in 中除去,直到 i 不再是因子。最终,如果 n > 1,说明 n 本身是一个质数,加入到结果中。所有的质因子被排序后输出。

这个方法的复杂度大约是 O(sqrt(n)),因为我们只检查到 sqrt(n),且每次 n 被分解时,都可以去除一个质因子。

2)完整代码解析

#include<bits/stdc++.h>
using namespace std;typedef long long ll;void solve()
{ll n;cin>>n;vector<ll>v;for(ll i=2; i <= n / i;i++){//那么i一定会被其质数给分解,假设i==4//那么i==4不会被整除,因为i会被2给消除完全//表明i不是n的质因子if(n%i!=0) continue;//此时有i这个因子,且一定为质数,因为假如i不是质数//接下来把i除干净while(n%i==0)   //还能被i整除{n/=i;}v.push_back(i);}//判断n是否本身就是质数if(n>1) v.push_back(n);sort(v.begin(),v.end());for(auto &i:v){cout<<i<<' ';}
}int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int _=1;while(_--) solve();return 0;
}

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

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

相关文章

欢乐力扣:同构字符串

文章目录 1、题目描述2、 代码 1、题目描述 同构字符串。给定两个字符串 s 和 t &#xff0c;判断它们是否是同构的。如果 s 中的字符可以按某种映射关系替换得到 t &#xff0c;那么这两个字符串是同构的。  每个出现的字符都应当映射到另一个字符&#xff0c;同时不改变字符…

【HeadFirst系列之HeadFirst设计模式】第7天之命令模式:封装请求,轻松实现解耦!

命令模式&#xff1a;封装请求&#xff0c;轻松实现解耦&#xff01; 大家好&#xff01;今天我们来聊聊设计模式中的命令模式&#xff08;Command Pattern&#xff09;。如果你曾经需要将请求封装成对象&#xff0c;或者希望实现请求的撤销、重做等功能&#xff0c;那么命令模…

敏捷开发07:敏捷项目可视化管理-ScrumBoard(Scrum板)使用介绍

ScrumBoard(Scrum板)介绍 ScrumBoard&#xff08;Scrum板&#xff09;是敏捷项目管理中使用的可视化工具&#xff0c;用于跟踪和监控冲刺阶段的任务进度。 主要通过可视化的看板来管理工作&#xff0c;它可视化了敏捷开发中的工作流程、任务状态、团队角色。 Scrum 团队在各…

Linux第十三节 — 进程状态详解

只要一个进程的PCB还存在内存当中&#xff0c;哪怕此时该进程对应的代码和数据已经在磁盘当中&#xff0c;此时依然认为该进程仍然存在&#xff01; 一、Linux进程的运行状态R 接下来我们看下面这个例子&#xff1a; 当我们执行这个程序的时候&#xff0c;我们认为该进程的状…

无人机遥控器接口作用详解!

USB接口&#xff1a; 功能&#xff1a;USB接口是一种通用串行总线接口&#xff0c;用于连接外部设备&#xff0c;如手机、平板、电脑或充电设备。在无人机遥控器上&#xff0c;USB接口通常用于数据传输和充电。 应用&#xff1a;用户可以通过USB接口将遥控器与电脑连接&#…

SVN把英文换中文

原文链接&#xff1a;SVN设置成中文版本 都是英文&#xff0c;换中文 Tortoise SVN 安装汉化教程(乌龟SVN) https://pan.quark.cn/s/cb6f2eee3f90 下载中文包

云手机如何进行经纬度修改

云手机如何进行经纬度修改 云手机修改经纬度的方法因不同服务商和操作方式有所差异&#xff0c;以下是综合多个来源的常用方法及注意事项&#xff1a; 通过ADB命令注入GPS数据&#xff08;适用于技术用户&#xff09; 1.连接云手机 使用ADB工具连接云手机服务器&#xff0c;…

【微服务优化】ELK日志聚合与查询性能提升实战指南

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

transfmer学习认识

整体架构 1.自注意机制 1.1.softmax 在机器学习和深度学习中&#xff0c;softmax 函数是一个常用的激活函数&#xff0c;用于将一个向量转换为一个概率分布。softmax 函数的公式如下&#xff1a; ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/35c158988402498ba6…

在 macOS 的 ARM 架构上按住 Command (⌘) + Shift + .(点)。这将暂时显示隐藏文件和文件夹。

在 macOS 的 ARM 架构&#xff08;如 M1/M2 系列的 Mac&#xff09;上&#xff0c;设置 Finder&#xff08;访达&#xff09;来显示隐藏文件夹的步骤如下&#xff1a; 使用快捷键临时显示隐藏文件&#xff1a; 在Finder中按住 Command (⌘) Shift .&#xff08;点&#xff…

【HarmonyOS NEXT星河版开发实战】天气查询APP

目录 前言 界面效果展示 首页 添加和删除 界面构建讲解 1. 获取所需数据 2. 在编译器中准备数据 3. index页面代码讲解 3.1 导入模块&#xff1a; 3.2 定义组件&#xff1a; 3.3 定义状态变量: 3.4 定义Tabs控制器: 3.5 定义按钮样式&#xff1a; 3.6 页面显示时触发…

idea debug功能演示线程安全问题

概述 用idea debug功能演示上一篇博客中提到的 本实现中的出队、入队的实现逻辑会不会有线程安全问题&#xff1f;如果有&#xff0c;怎么解决&#xff1f; 测试用例 package com.lovehena.datastructure.test;import com.lovehena.datastructure.ArrayQueue;/* * 测试 offer…

力扣每日一题【算法学习day.132】

前言 ###我做这类文章一个重要的目的还是记录自己的学习过程&#xff0c;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&#xff01;&#xff01;&#xff01; 习题 1.统计相似字符串对的数目 题目链…

C++操作符重载案例

在学习ZLToolKit源码时&#xff0c;发现代码中涉及好多运算符重载&#xff0c;因此对其做一下归类学习。 直接写一个代码案例如下&#xff1a; #include <iostream> #include <memory> #include <functional>// 定义类 A class A { public:A(int a) { _a a…

Kafka系列之:记录一次源头数据库刷数据,造成数据丢失的原因

Kafka系列之:记录一次源头数据库刷数据,造成数据丢失的原因 一、背景二、查看topic日志信息三、结论四、解决方法一、背景 源头数据库在很短的时间内刷了大量的数据,部分数据在hdfs丢失了 理论上debezium数据采集不会丢失,就需要排查数据链路某个节点是否有数据丢失。 数据…

爬虫小案例豆瓣电影top250(json格式)

1.json格式&#xff08;仅供学习参考&#xff09; import requests, json, jsonpathclass Start(object):# 类实例化时会执行def __init__(self):self.headers {user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.…

位运算实用技巧与LeetCode实战

位操作&#xff08;Bit Manipulation&#xff09;有很多有趣的技巧&#xff0c;其中一个比较著名的资源是 Bit Twiddling Hacks 网站&#xff0c;它收集了各种位操作的高阶玩法&#xff0c;网址是&#xff1a; http://graphics.stanford.edu/~seander/bithacks.html 不过&…

Android输入事件传递流程系统源码级解析

1. 硬件层到Linux内核 设备节点&#xff1a;触摸事件由内核驱动捕获&#xff0c;写入/dev/input/eventX。关键结构体&#xff1a;input_event&#xff08;包含时间戳、类型、代码、值&#xff09;。 2. Native层处理&#xff08;system_server进程&#xff09; 2.1 EventHub …

【云安全】云原生-Docker(六)Docker API 未授权访问

Docker API 未授权访问 是一个非常严重的安全漏洞&#xff0c;可能导致严重的安全风险。 什么是 Docker API &#xff1f; Docker API 是 Docker 容器平台提供的一组 RESTful API&#xff0c;用于与 Docker 守护程序进行通信和管理 Docker 容器。通过 Docker API&#xff0c;…

请说明C#中的List是如何扩容的?

在 C# 中&#xff0c;List<T>是一个动态数组&#xff0c;它会根据需要自动调整其容量以容纳更多的元素。 目录 1 扩容条件与扩容算法规则 2 总结 1 扩容条件与扩容算法规则 当你创建一个新的List<T>实例时&#xff0c;如果没有指定初始容量&#xff0c;它会使…