首页 > 编程语言 >javascript 两点之间的积分点数(Number of Integral Points between Two Points)

javascript 两点之间的积分点数(Number of Integral Points between Two Points)

时间:2024-12-19 10:30:57浏览次数:5  
标签:return abs 16 积分 points javascript Integral Points GCD

给定两点p (x1, y1) 和q (x2, y2),计算连接它们线上的积分点的数量。

输入:x1 = 2,y1 = 2,x2 = 5,y2 = 5

输出:2

解释:连接 (2,2) 和 (5,5) 的线上只有 2 个整数点。这两个点是 (3,3) 和 (4,4)。

输入:x1 = 1,y1 = 9,x2 = 8,y2 = 16

输出:6

解释:连接 (1,9) 和 (8,16) 的线上有 6 个整数点。

更多示例:

    如果点为 (0, 2) 和 (4, 0),则位于其上的整数点数只有一个,即 (2, 1)。 同样,如果点为 (1, 9) 和 (8, 16),则位于其上的整数点为 6,它们分别为 (2, 10)、(3, 11)、(4, 12)、(5, 13)、(6, 14) 和 (7, 15)。 

简单方法

    从给定的任意点开始,使用循环到达另一个端点。对于循环内的每个点,检查它是否位于连接给定两个点的线上。如果是,则将计数增加 1。此方法的时间复杂度为 O(min(x2-x1, y2-y1))。
    
最佳方法

    1. 如果连接p和q形成的边平行于 Y 轴,则   顶点之间的积分点数为:abs(p.y - q.y)-1 
    
    2. 类似地,如果边平行于 X 轴,则   两者之间的积分点数为:abs(p.x - q.x)-1 
    
    3. 否则,我们可以   使用以下公式找到顶点之间的积分点:GCD(abs(p.x - q.x), abs(p.y - q.y)) - 1

GCD 公式如何工作?

    其原理是找到最简形式的直线方程,即在方程 ax + by +c 中,系数 a、b 和 c 互质。我们可以通过计算 a、b 和 c 的 GCD(最大公约数)并将 a、b 和 c 转换为最简形式来实现这一点。 
    然后,答案将是(y 坐标差)除以 (a) – 1。这是因为在计算 ax + by + c = 0 后,对于不同的 y 值,x 将是可以被 a 整除的 y 值的数量。

以下是上述想法的实现:

<script>
// javascript code to find the number of integral points
// lying on the line joining the two given points
    // Class to represent an Integral point on XY plane.
     class Point {
    
        constructor(a , b) {
            this.x = a;
            this.y = b;
        }
    }

    // Utility function to find GCD of two numbers
    // GCD of a and b
    function gcd(a , b) {
        if (b == 0)
            return a;
        return gcd(b, a % b);
    }

    // Finds the no. of Integral points between
    // two given points.
    function getCount( p,  q)
    {
    
        // If line joining p and q is parallel to
        // x axis, then count is difference of y
        // values
        if (p.x == q.x)
            return Math.abs(p.y - q.y) - 1;

        // If line joining p and q is parallel to
        // y axis, then count is difference of x
        // values
        if (p.y == q.y)
            return Math.abs(p.x - q.x) - 1;

        return gcd(Math.abs(p.x - q.x), Math.abs(p.y - q.y)) - 1;
    }

    // Driver program to test above    
         p = new Point(1, 9);
         q = new Point(8, 16);

        document.write("The number of integral points between " + "(" + p.x + ", " + p.y + ") and (" + q.x + ", "
                + q.y + ") is " + getCount(p, q));

// This code is contributed by gauravrajput1
</script>

输出: 

(1, 9)和(8, 16)之间的积分点数为 6

时间复杂度: O(log(min(a,b))),因为我们使用递归来查找 GCD。

辅助空间: O(log(min(a,b))),用于递归堆栈空间。

标签:return,abs,16,积分,points,javascript,Integral,Points,GCD
From: https://blog.csdn.net/hefeng_aspnet/article/details/143485181

相关文章

  • Z-BlogPHP 后台 JavaScript 加载失败的原因是什么?
    “后台JavaScript加载失败”错误通常出现在Z-BlogPHP中,表示浏览器在加载后台页面时无法正确加载JavaScript文件。以下是常见的原因和解决方法:浏览器版本过低:使用老旧的浏览器版本(如IE6/7/8等)可能导致JavaScript加载失败。解决方法:更新浏览器到最新版本,建议使用现......
  • 2024实测验证可用的股票数据接口集合.:python、JavaScript 、JAVA等实例代码演示教你如
    实测可用的股票数据接口,可以直接点击在浏览器中验证:沪深两市股票列表API接口链接(可点击验证):https://api.mairui.club/hslt/list/b997d4403688d5e66a【实时数据接口】沪深两市实时交易数据接口API接口链接(可点击验证):https://api.mairui.club/hsrl/ssjy/000001/b997d4403......
  • JavaScript中var、let和const的区别是什么?
    1.变量声明关键字概述1.1var关键字的特点var是JavaScript中传统的变量声明关键字,它具有以下特点:函数作用域:使用var声明的变量在函数内部是局部的,仅在该函数内部可见。全局作用域:在函数外部声明的var变量是全局的,在整个程序中都可访问。变量提升:var声明的变......
  • 前端必知必会-JavaScript HTML DOM 导航
    文章目录JavaScriptHTMLDOM导航DOM节点DOMHTML树节点关系节点树在节点之间导航子节点和节点值InnerHTMLDOM根节点document.body-文档的正文nodeName属性nodeName是只读的nodeValue属性nodeType属性总结JavaScriptHTMLDOM导航使用HTMLDOM,您可以使......
  • 前端必知必会-JavaScript HTML DOM 元素(节点)
    文章目录JavaScriptHTMLDOM元素(节点)添加和删除节点(HTML元素)创建新的HTML元素(节点)创建新的HTML元素-insertBefore()删除现有HTML元素删除子节点替换HTML元素总结JavaScriptHTMLDOM元素(节点)添加和删除节点(HTML元素)创建新的HTML元素(节点)要向HT......
  • 前端必知必会-JavaScript HTML DOM 集合
    文章目录JavaScriptHTMLDOM集合HTMLCollection对象HTMLHTMLCollection长度总结JavaScriptHTMLDOM集合HTMLCollection对象getElementsByTagName()方法返回HTMLCollection对象。HTMLCollection对象是HTML元素的数组式列表(集合)。以下代码选择文档......
  • 2024-12-18:正方形中的最多点数。用go语言,给定一个二维数组 points 和一个字符串 s,其中
    2024-12-18:正方形中的最多点数。用go语言,给定一个二维数组points和一个字符串s,其中points[i]表示第i个点的坐标,s[i]表示第i个点的标签。如果一个正方形的中心在(0,0),边与坐标轴平行,并且内部没有标签相同的两个点,则称这个正方形为“合法”的。你的任务是返回可以被“合......
  • JavaScript中的var、let和const:变量声明的演变与最佳实践
    在JavaScript中,变量声明是编程的基础。随着ECMAScript6(ES6)的发布,引入了let和const关键字,使得变量声明更加灵活和安全。本文将探讨var、let和const的区别,并通过示例代码展示它们的用法。1.var关键字var是JavaScript中最古老的变量声明方式。它的作用域是函数作用域或全......
  • 深入理解 Node.js 模块系统:构建高效、可维护的 JavaScript 代码
    摘要:Node.js的模块系统是其强大功能的核心之一,它允许开发者将代码组织成模块化的结构,从而提高代码的可维护性和重用性。本文将深入探讨Node.js模块系统的各个方面,包括模块概述、成员导出与导入、ModuleWrapperFunction以及Node.js内置模块,帮助你更好地理解和利用这......
  • Drag and Drop API 实现 JavaScript 中的原生拖放功能
    理解什么是拖放,我们先做个简单的实验。鼠标移动到页面左上角“CSDN”图片上方,点击左键不放开,拖动鼠标,发现图片随着鼠标移动,松开鼠标时,图片消失。一、拖放(DragandDrop)有什么作用?在JavaScript中,拖放(DragandDrop)是一种用户界面交互模式,允许用户通过鼠标选择、拖动和......