【算法】数学相关知识总结

news2024/11/8 15:37:07

文章目录

  • gcd 和 lcm
  • 取模运算 %
  • 求一个点和一片矩形区域之间的最短距离

本文用于记录一些关于算法题中偶尔被使用到的数学相关知识。

gcd 和 lcm

gcd 和 lcm 分别是 最大公约数(Greatest common divisor) 和 最小公因数(Least Common Multiple)。

常用的 gcd 算法使用的是欧几里得算法,也就是辗转相除算法。原理如下:

1.有两个数a和b,我们把较大的数传给maxn,较小的数传给minx
2.用maxn对minx进行取余运算,如果余数为0,那么a,b的最大公约数为a,
3.若余数不为0,a,b的最大公约数为minx和余数的最大公约数,我们在循环到第一步进行计算。

将算法描述翻译成代码如下:

public int gcd(int a, int b) {
    if (a < b) return gcd(b, a);    // 确保 a 是较大的数字
    while (a % b != 0) {	// 一直相除到余数为 0
        int t = a % b;		// 求余数
        a = b;	// 
        b = t;	// 
    }
    return b;
}

推荐写法
经过精简之后可以写成如下形式(原理是一样的,只不过从迭代改成了递归的形式,代码会更短一些。)(或者可以这样来理解这种写法基于的一个事实:对于任何两个整数a和b,gcd(a, b)和gcd(b, a % b)是相同的

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

此外还有一种 if + while + 位运算的写法:

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

通过使用 System.currentTimeMillis() 来测算程序运行的时间,可以发现后两种写法的耗时要短一些。(后两种的速度差不多都是第一种 while 循环的两倍左右

最大公约数与质数的关系:通过判断两个或者多个整数之间的公约数只有1,就可以说它们是互质的。


lcm 的写法在 gcd 的基础之上,即两个数相乘然后除最大公约数即为最小公倍数

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

参考资料:
gcd和lcm(最大公约数,最小公倍数)
【C++】gcd函数的写法
D351周赛复盘:美丽下标对数目(互质/数学运算)+数组划分若干子数组

取模运算 %

如果让你计算 1234 ∗ 6789 1234 * 6789 12346789个位数,你会如何计算?
由于只有个位数会影响到乘积的个位数,因此 4 ∗ 9 = 36 4 * 9 = 36 49=36 的个位数 6 就是答案。

将这个结论抽象成数学等式如下:

( a + b )   m o d   m = ( ( a   m o d   m ) + ( b   m o d   m ) )   m o d   m (a + b) \bmod m = ((a \bmod m) + (b \bmod m)) \bmod m (a+b)modm=((amodm)+(bmodm))modm
( a ∗ b )   m o d   m = ( ( a   m o d   m ) ∗ ( b   m o d   m ) )   m o d   m (a * b) \bmod m = ((a \bmod m) * (b \bmod m)) \bmod m (ab)modm=((amodm)(bmodm))modm

在这里插入图片描述
参考资料:
https://leetcode.cn/problems/movement-of-robots/solution/nao-jin-ji-zhuan-wan-pai-xu-tong-ji-pyth-we55/

求一个点和一片矩形区域之间的最短距离

以一道题目为例:https://leetcode.cn/problems/circle-and-rectangle-overlapping/

在这里插入图片描述
在这里插入图片描述

class Solution {
    public boolean checkOverlap(int radius, int xCenter, int yCenter, int x1, int y1, int x2, int y2) {
        double dist = 0;
        if (xCenter < x1 || xCenter > x2) {
            dist += Math.min(Math.pow(x1 - xCenter, 2), Math.pow(x2 - xCenter, 2));
        }
        if (yCenter < y1 || yCenter > y2) {
            dist += Math.min(Math.pow(y1 - yCenter, 2), Math.pow(y2 - yCenter, 2));
        }
        return dist <= radius * radius;
    }
}

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

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

相关文章

Nginx-redis【会话保持】

什么是会话保持 当用于登录一个网站服务器&#xff0c; 网站服务器会将用户的登录信息存储下来&#xff08;存储session&#xff09;&#xff0c;以保证我们能一直处于登录在线的状态 为什么要做会话保持 由于我们使用的是负载均衡轮询机制&#xff0c;会导致用户请求分散在…

nginx页面优化

文章目录 nginx页面优化一.nginx优化1.版本号1.1查看版本号1.2修改版本号1.2.1修改配置文件1.2.2修改源码文件&#xff0c;重新编译安装 2.nginx的日志分割2.1 写日志分割的脚本2.2给脚本执行权限、执行2.3创建定时任务可以每个月固定分割一次 3.nginx的页面压缩3.1配置3.2验证…

第1讲 Camera Sensor Driver课程简介

更多资源&#xff1a; 资源描述在线课程极客笔记在线课程知识星球星球名称&#xff1a;深入浅出Android Camera 星球ID: 17296815Wechat极客笔记圈 课程内容介绍 目标&#xff1a; 课程主要帮助大家理解camera sensor基本概念及原理知识&#xff0c;理解高通camera sensor驱…

前端开发——常用案例分享

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

美one,不想只做李佳琦背后的MCN

文 | 螳螂观察 作者 | 青月 今年618&#xff0c;处在消费提振的关键时期&#xff0c;又面临着行业竞争日趋激烈&#xff0c;各大电商平台都希望能交出一份让市场满意的“期中答卷”&#xff0c;直播不可避免的成为了“兵家必争之地”。 京东请来了罗永浩与“交个朋友”入驻&a…

抖音seo矩阵系统源码|需求文档编译说明(二)

目录 1.抖音seo矩阵系统文档开发流程 2.各平台源码编译方式说明 3.底层技术功能表达式 1.抖音seo矩阵系统文档开发流程 ①产品原型 ②需求文档 ③产品流程图 ④部署方式说明 ⑤完整源码 ⑥源码编译方式说明 ⑦三方框架和SDK使用情况说明和代码位置 ⑧平台操作文档 ⑨程序架…

完美外贸企业邮箱签名设置指南:提升专业形象,优化商务沟通

邮箱签名是一个很好的方式&#xff0c;让您的外贸企业觉得你的公司比较专业。它可以包括公司名称和标志&#xff0c;联系信息和其他相关信息。以下是一些指导原则&#xff0c;可以帮助您创建适合您业务的邮箱签名: 第一步:选择一个合适的Logo 选择一个适合你的企业的标志是很重…

踏响新中国钢铁工业的铿锵足音《淬火丹心》湖北卫视热血开播

由湖北省广播电视局、湖北广播电视台、湖北长江华晟影视有限责任公司等联合摄制&#xff0c;向勇执导&#xff0c;唐曾、吕一、王雨、董晴等主演的大型现代工业题材剧《淬火丹心》&#xff0c;将于6月25日登陆湖北卫视长江剧场开播。该剧以年轻一代中国钢铁人的励志成长为主线&…

排序算法——计数排序

计数排序 以升序排序为例 文章目录 计数排序什么是计数排序实现思路具体步骤实现代码时间复杂度和局限性时间复杂度局限性 什么是计数排序 计数排序是一个非基于比较的排序算法&#xff0c;该算法于1954年由 Harold H. Seward 提出基本思想&#xff1a;是对于给定的输入序列中…

运算放大器(一):电压跟随器

一、电压跟随器 电压跟随器&#xff08;单位增益放大器、缓冲放大器或隔离放大器&#xff09;是一种电压放大倍数为 1 的运算放大器&#xff0c;能够将输入信号的电压放大到同样的幅度并输出&#xff0c;同时保持输入输出电阻不变&#xff08;电压跟随器的输入电阻很大&#x…

Python网络编程:socket包的用法

持续补充 1 网络编程 网络编程&#xff0c;主要用于两台或多台计算机之间的通信&#xff0c;也可以是同一台计算机内不同进程之间的通信。Socket套接字可以用来实现网络通信。关于Socket套接字&#xff0c;需要注意以下几点&#xff1a; Socket是网络通信中应用层和传输层之间…

安装numpy

pip install numpy1.21.6 -i https://mirrors.aliyun.com/pypi/simple/ 最外面的python.exe 是默认版本 下载包----第二种方式

调用有道API实现图片翻译

调用有道API实现图片翻译 1&#xff0e;作者介绍2&#xff0e;关于理论方面的知识介绍3&#xff0e;调用有道API实现图片翻译实验3.1官方代码与结果3.2解码3.3换行输出3.4 示例展示 1&#xff0e;作者介绍 周慧龙&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff…

心电图机原理及电路超详细讲解

心电图机原理及电路超详细讲解 心电图主要器件导联单极导联和双极导联威尔逊中心端加压导联胸导联 心电图机的结构电路框图介绍输入部分过压保护电路高频滤波电路低压保护及缓冲放大器屏蔽驱动电路导联选择起搏脉冲抑制与定标电路肌电滤波、时间常数电路、封闭电路与电极异常检…

【OC底层_消息发送与转发机制原理】

文章目录 前言动态类型动态绑定为何为动态语言&#xff1f; 什么是消息传递选择子SELIMPIMP和SEL的关系 消息发送1. 快速查找objc_msgSend()的执行流程objc_msgSend()深基核心逻辑及其参数解析源码解析消息发送的快速查找总结&#xff1a;objc_msgSend(receiver, sel, …)对于b…

接口测试Post请求提交数据的四种类型

常见的post提交数据类型有四种&#xff1a; 第一种&#xff1a;application/json 这是最常见的json格式&#xff0c;也是非常友好的深受小伙伴喜欢的一种&#xff0c;如下 {“input1”:“xxx”,“input2”:“ooo”,“remember”:false} 第二种&#xff1a;application/x-www…

【MySQL实战】笔记

1、MySQL的基本架构组成 MySQL的基本架构组成包括以下几个部分&#xff1a; 连接器&#xff08;Connection Manager&#xff09;&#xff1a;负责与客户端建立连接&#xff0c;并处理客户端发送的请求。连接器会验证客户端的身份、分配线程和缓存等资源&#xff0c;并将请求转…

pdf转excel怎么样格式不乱?这两个方法轻松转换!

PDF和Excel是广泛应用的文件格式&#xff0c;然而&#xff0c;将PDF转换为Excel时&#xff0c;常常面临格式混乱的问题。幸运的是&#xff0c;我们有记灵在线工具和Adobe Acrobat Pro软件这两个简单而有效的方法&#xff0c;可以帮助我们将PDF转换为Excel并保持格式整齐。本文将…

复旦微7045环境安装

Linux Petalinux 0.下载 更换下载源&#xff1a;https://blog.csdn.net/u012308586/article/details/102737950 更换中文&#xff1a;https://cloud.tencent.com/developer/article/2159346 1.配置 配置/bin/sh 由于 petalinux 用到的/bin/sh 命令都是 bash 的&#xff0c…