当前位置: 首页 > news >正文

算法通关村-----数论问题解析

最大公约数和最小公倍数

概念描述

最大公约数(GCD)是指两个或多个整数共有约数中的最大值。
最小公倍数(LCM)是指两个或多个整数共有的倍数中的最小值

方法介绍

碾转相除法

一种用于计算两个整数的最大公约数(GCD)的方法。它基于以下原理:两个数的最大公约数等于其中较小数除以它们的余数的最大公约数。
该算法的步骤如下:

  1. 将两个整数记为a和b,其中a是较大的数,b是较小的数。
  2. 用a除以b,得到一个商q和余数r。
  3. 如果r等于0,则b就是最大公约数,算法结束。
  4. 如果r不等于0,则将a更新为b,b更新为r,然后返回第二步继续执行。
  5. 重复执行步骤2-4,直到余数为0为止。

两个数的乘积除以两个数的最大公约数即为两个数的最小公倍数

代码实现

求解最大公约数

public int gcd(int a, int b) {int k = 0;while (k!=0){k = a%b;a = b;b = k;};return a;
}

求解最小公倍数

public int mcl(int a, int b) {int gcd = gcd(a, b);return a * b / gcd;
}

素数与合数

概念介绍

素数又称为质数,素数首先要满足大于等于2,并且除了1和它本身之外,不能被任何其他自然数整除。其他数都是合数。比较特殊的是1即非素素数,也非合数。2是唯一的同时为偶数和素数的数字。

方法介绍

要判断一个数是否为质数,可以使用以下方法:

  1. 特殊情况处理:首先排除小于2的数,因为质数定义为大于1的自然数。
  2. 试除法:从2开始,逐个将待判断的数除以从2到其平方根范围内的所有整数(包括平方根),如果能够整除,则该数不是质数。如果在整个范围内都没有找到能整除的数,则该数是质数。

代码实现

public boolean isPrime(int num){int max = (int)Math.sqrt(num);for (int i = 2; i<=max;i++){if(num%i==0){return false;}}return true;
}

质数计数

问题描述

给定整数 n ,返回所有小于非负整数 n 的质数的数量 。详见leetcode204

问题分析

最直接的方式就是从2开始遍历,每次利用上面的质数判断代码对每一个数字进行判断,如果是质数,计数器➕1,直至计数器为n,返回当前质数。这样做时间复杂度过高。可以通过空间换时间的方式来操作,设置一个长度为n的数组,初始时,设置数组全为1,之后,从下标2开始遍历,如果数组当前值为1,质数计数器➕1,并将当前数字的倍数以及与倍数相关的非质数下标设置为0,最后返回质数计数器的值。这种方式也被称为埃氏筛

代码实现

直接方式

public int countPrimes(int n) {int count = 0;for(int i=2;i<n;i++){if(isPrime(i)){count++;}}return count;
}public boolean isPrime(int num){int max = (int)Math.sqrt(num);for (int i = 2; i<=max;i++){if(num%i==0){return false;}}return true;
}

埃氏筛方式

public int countPrimes(int n) {int[] isPrime = new int[n];int count = 0;Arrays.fill(isPrime,1);for(int i=2;i<n;i++){if(isPrime[i]==1){count++;if((long)i*i<n){for(int j=i*i;j<n;j+=i){isPrime[j]=0;}}}}return count;
}

丑数判断

问题描述

丑数 就是只包含质因数 2、3 和 5 的正整数。

给你一个整数 n ,请你判断 n 是否为 丑数 。如果是,返回 true ;否则,返回 false 。详见leetcode263

问题分析

可以直接根据丑数的概念进行判断。如果不包含质因数或者包含质因数 2、3 和 5 的正整数即为丑数

代码实现

public boolean isUgly(int n) {if(n<=0){return false;}int[] factors = new int[]{2,3,5};for(int factor:factors){while(n%factor==0){n = n/factor;}}return n==1;
}

丑数计数

问题描述

给你一个整数 n ,请你找出并返回第 n 个 丑数 。详见leetcode264

问题分析

最直接的方式就是从1开始遍历,每次利用上面的丑数判断代码对每一个数字进行判断,如果是质数,计数器➕1,直至计数器为n,返回当前丑数。这样做时间复杂度过高。可以通过空间换时间的方式来操作,设置一个小顶堆,初始时,将最小的丑数1加入队中,循环n次,每次将堆顶元素x移除,每次将2x,3x,5x放入堆中,为了避免重复,可以使用集合过滤,循环n次之后,最小的第n个丑数出堆返回

代码实现

直接方式

public int nthUglyNumber(int n) {int count = 0;int i=1;while(true){if(isUgly(i)){count++;if(count==n){return i;}}i++;}
}public boolean isUgly(int num){if(num<=0){return false;}int[] factors = new int[]{2,3,5};for(int factor:factors){while(num%factor==0){num = num/factor;}}return num==1;
}

最小堆方式

public int nthUglyNumber(int n) {int[] factors = {2, 3, 5};Set<Long> seen = new HashSet<Long>();PriorityQueue<Long> heap = new PriorityQueue<Long>();seen.add(1L);heap.offer(1L);int ugly = 0;for (int i = 0; i < n; i++) {long curr = heap.poll();ugly = (int) curr;for (int factor : factors) {long next = curr * factor;if (seen.add(next)) {heap.offer(next);}}}return ugly;
}

相关文章:

算法通关村-----数论问题解析

最大公约数和最小公倍数 概念描述 最大公约数&#xff08;GCD&#xff09;是指两个或多个整数共有约数中的最大值。 最小公倍数&#xff08;LCM&#xff09;是指两个或多个整数共有的倍数中的最小值 方法介绍 碾转相除法 一种用于计算两个整数的最大公约数&#xff08;GCD…...

wpf prism当中 发布订阅 IEventAggregator

先订阅后发布 private readonly IEventAggregator _eventAggregator; public LoginViewModel(ILoginService iloginService, IEventAggregator eventAggregator) {_iloginService iloginService;_eventAggregator eventAggregator;_eventAggregator.GetEvent<MessageEven…...

Angular中的getter函数

Angular 中的 getter 函数每次被调用时会返回一个新对象时&#xff0c;这些新对象并不使用同一个堆内存。详细解释一下&#xff1a; Getter 函数的作用是获取某个属性的值。在 Angular 中&#xff0c;getter 函数通常用于获取响应式数据&#xff08;例如 Observables 或 Signal…...

Python----函数的数据 拆包(元组和字典)

Python拆包&#xff1a; 就是把元组或字典中的数据单独的拆分出来&#xff0c;然后赋予给其他的变量。 拆包: 对于函数中的多个返回数据, 去掉 元组, 列表 或者字典 直接获取里面数据的过程。 元组的拆包过程 def func():# 经过一系列操作返回一个元组return 100, 200 …...

vim翻页快捷键

Vim翻页 整页 Ctrlf向下翻页&#xff0c;下一页&#xff0c;相当于Page DownCtrlb向上翻页&#xff0c;上一页&#xff0c;相当于Page Up 半页 Ctrld向下半页&#xff0c;下一半页&#xff0c;光标下移Ctrlu向上半页&#xff0c;上衣半页&#xff0c;光标上移 按行 Ctrle…...

死锁是什么?死锁是如何产生的?如何破除死锁?

1. 死锁是什么 多个线程同时被阻塞&#xff0c;它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞&#xff0c;因此程序不可能正常终止。 2. 死锁的三种典型情况 一个线程, 一把锁, 是不可重入锁, 该线程针对这个锁连续加锁两次, 就会出现死锁. 两个线程…...

给虚拟机配置静态id地址

1.令人头大的原因 当连接虚拟机的时候 地址不一会就改变&#xff0c;每次都要重新输入 2.配置虚拟机静态id地址 打开命令窗口执行 : vim /etc/sysconfig/network-scripts/ifcfg-ens33 按下面操作修改 查看自己子网掩码 3.重启网络 命令行输入 systemctl restart netwo…...

Mybatis-Plus 租户使用

Mybatis-Plus 租户使用 文章目录 Mybatis-Plus 租户使用一. 前言1.1 租户存在的意义1.2 租户框架 二. Mybatis-plus 租户2.1 租户处理器2.2 前置准备1. 依赖2. 表及数据准备3. 代码生成器 2.3 使用 三. 深入使用3.1 前言3.2 租户主体设值&#xff0c;取值3.3 部分表全量db操作3…...

vue el-table (固定列+滚动列)【横向滚动条】确定滚动条是在列头还是列尾

效果图&#xff1a; 代码实现&#xff1a; html&#xff1a; <script src"//unpkg.com/vue2/dist/vue.js"></script> <script src"//unpkg.com/element-ui2.15.14/lib/index.js"></script> <div id"app" style&quo…...

⑦【Redis GEO 】Redis常用数据类型:GEO [使用手册]

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ Redis GEO ⑦Redis GEO 基本操作命令1.geoadd …...

LeetCode 2304. 网格中的最小路径代价:DP

【LetMeFly】2304.网格中的最小路径代价&#xff1a;DP 力扣题目链接&#xff1a;https://leetcode.cn/problems/minimum-path-cost-in-a-grid/ 给你一个下标从 0 开始的整数矩阵 grid &#xff0c;矩阵大小为 m x n &#xff0c;由从 0 到 m * n - 1 的不同整数组成。你可以…...

c 实用化的文本终端实时显示摄像头视频

因为采用yuv格式&#xff0c;帧率都很低。图像会拖影。把图像尺寸尽量缩小&#xff0c;能大大改善。现在最麻烦的是图像上有黑色的闪影&#xff0c;不知是为啥&#xff1f;如是framebuffer引起的就无解了。终于找到问题了&#xff0c;是在显示前加了一条用黑色清屏造成的&#…...

CSS中常用的伪类选择器

一 、伪类&#xff08;不存在的类&#xff0c;特殊的类&#xff09; -伪类用来描述一个元素的特殊状态 比如&#xff1a;第一个元素&#xff0c;被点击的元素&#xff0c;鼠标移入的元素 -特点&#xff1a;一般请情况下&#xff0c;使用&#xff1a;开头 1、 :first-child …...

【python学习】中级篇-数据库操作:SQLite

SQLite是一个轻量级的数据库引擎&#xff0c;它可以嵌入到各种应用程序中。以下是SQLite的基本用法&#xff1a; 创建数据库文件 import sqlite3# 连接到一个不存在的数据库文件&#xff0c;如果文件不存在&#xff0c;将会自动创建一个新的数据库文件 conn sqlite3.connect…...

汇编-PROTO声明过程

64位汇编 64 模式中&#xff0c;PROTO 伪指令指定程序的外部过程&#xff0c;示例如下&#xff1a; ExitProcess PROTO ;指定外部过程&#xff0c;不需要参数.code main PROCmov ebx, 0FFFFFFFFh mov ecx,0 ;结束程序call ExitProcess ;调用外部过程main ENDP END 32位…...

MYSQL事务操作

...

自动化测试——自动卸载软件

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…...

Linux - 系统调用(syscall)

说明 基于riscv64 soc linux_5.10.4平台&#xff0c;通过新增一个系统调用深入了解下系统调用实现原理。 简介 Linux 软件运行环境分为用户空间和内核空间&#xff0c;默认情况下&#xff0c;用户进程无法访问内核&#xff0c;既不能访问内核所在的内存空间&#xff0c;也不…...

c语言-冒泡排序

冒泡排序原理&#xff1a; 冒泡排序是一种简单直观的排序算法&#xff0c;它重复地遍历待排序的元素序列&#xff0c;比较相邻的两个元素&#xff0c;如果它们的顺序不符合要求&#xff08;例如升序要求前面的元素小于后面的元素&#xff09;&#xff0c;则交换它们的位置。遍历…...

Mysql面经

Select语句的执行顺序 1、from 子句组装来自不同数据源的数据&#xff1b; 2、where 子句基于指定的条件对记录行进行筛选&#xff1b; 3、group by 子句将数据划分为多个分组&#xff1b; 4、使用聚集函数进行计算&#xff1b;AVG() SUM() MAX() MIN() COUNT() 5、使用 havin…...

区块链应用·数据共享消除数字鸿沟

基于FISCO BCOS与Go语言构建可信数据共享基础设施,打通跨机构、跨地域的信任壁垒 一、数字鸿沟的根源:信任缺失下的“数据孤岛” 数字鸿沟(Digital Divide)不仅存在于不同区域、不同群体之间,更深层次地体现在数据持有者之间的信任鸿沟。在传统信息系统中,数据分散存储于…...

Halcon 实战指南:基于局部形变的模板匹配在柔性物体检测中的应用与参数调优

1. 柔性物体检测的挑战与局部形变匹配的价值 在工业视觉检测中&#xff0c;软包装、纺织品、橡胶件等柔性物体的检测一直是个难题。这些材料在传送带或机械臂抓取过程中&#xff0c;难免会发生拉伸、褶皱等轻微形变。传统的刚性模板匹配方法在这里往往会失效——因为哪怕1%的形…...

ISO 15118-20:2022 深度解读:第二代车网通信接口如何重塑智能充电与电网互动

1. ISO 15118-20:2022标准的前世今生 第一次听说ISO 15118这个标准时&#xff0c;我正蹲在充电站调试一台死活连不上充电桩的电动车。当时满脑子都是"为什么连个充电都要搞这么复杂&#xff1f;"后来才知道&#xff0c;这背后藏着整个电动汽车与电网对话的密码。ISO…...

Workout.Cool:打造您的终极开源健身教练平台,3大核心功能全面解析

Workout.Cool&#xff1a;打造您的终极开源健身教练平台&#xff0c;3大核心功能全面解析 【免费下载链接】workout-cool &#x1f3cb; Modern open-source fitness coaching platform. Create workout plans, track progress, and access a comprehensive exercise database.…...

Godot逆向工程工具GDSDecomp:游戏资源解构与重构的深度解析

Godot逆向工程工具GDSDecomp&#xff1a;游戏资源解构与重构的深度解析 【免费下载链接】gdsdecomp Godot reverse engineering tools 项目地址: https://gitcode.com/GitHub_Trending/gd/gdsdecomp 在游戏开发与维护的生命周期中&#xff0c;资源包的管理与逆向分析一直…...

Elasticsearch核心架构:Index索引详解与管理操作大全

Elasticsearch核心架构&#xff1a;Index索引详解与管理操作大全一、前言二、Elasticsearch Index&#xff1a;基础定义2.1 什么是 Index 索引&#xff1f;2.2 索引核心特点2.3 ES 索引与数据库概念对比三、Elasticsearch Index&#xff1a;内部架构与流程图3.1 索引内部组成结…...

CloudWatch 告警 AI 智能分析系统完整实战

告警触发 60 秒内,自动采集 5 类服务的真实监控数据,调用 Claude 生成深入根因分析报告存入 S3,同时推送精简版到 IM 群并附完整报告链接。 前言 痛点 运维收到告警后的标准动作:登录 Console → 查指标 → 查日志 → 查服务状态 → 判断原因,耗时 10-30 分钟。夜间告警…...

从API到自动化:构建懒人专属的Crack运动脚本

1. 懒人运动黑科技&#xff1a;用API解放双手 作为一个资深懒癌患者&#xff0c;我完全理解那种"连跑步都想自动化"的心情。去年为了完成某运动App的打卡任务&#xff0c;我花了整整两周时间研究如何用技术手段解放双腿。最终实现的方案&#xff0c;就是用百度地图AP…...

Superpowers - 16 用好「finishing-a-development-branch 」这最后一步:从混乱收尾到可复用的工程化流程

文章目录Pre一、这个技能到底解决什么问题&#xff1f;1.1 问题&#xff1a;收尾阶段的“灰色地带”1.2 位置&#xff1a;它不是一个“命令”&#xff0c;而是两个工作流的终点二、设计理念&#xff1a;元数据、显式激活与“五步完成协议”2.1 前置元数据&#xff1a;何时触发、…...

告别忘打卡!用MT管理器+Termux在安卓上实现钉钉自动签到(附Python脚本)

安卓自动化打卡实战&#xff1a;零基础用MT管理器Termux实现钉钉定时签到 每天早上匆忙赶地铁时&#xff0c;你是否也经历过这样的场景&#xff1a;挤在人群中突然想起还没打卡&#xff0c;慌忙掏出手机却发现网络延迟&#xff0c;眼睁睁看着考勤异常提醒弹出&#xff1f;对于依…...