0

0

找到给定范围内的最大公约数

PHPz

PHPz

发布时间:2023-08-28 14:28:41

|

1368人浏览过

|

来源于tutorialspoint

转载

找到给定范围内的最大公约数

问题表明我们需要找到给定范围内的 GCD。我们将得到两个正整数 x 和 y 以及两个整数 p 和 q,其范围为 [p,q]。我们需要找出落在 [p,q] 范围内的数字 x 和 y 的 GCD(最大公约数)。 GCD,在数学中被称为最大公约数,是两个给定正整数相除的最大正整数。给定的整数不得为零。对于任意两个正整数 x 和 y,它表示为 gcd(x,y)。

例如,我们有两个正整数 6 和 9。最大公约数 gcd(6,9) 将为 3,因为它是除以这两个数字的最大数。

但是在这个问题中,我们需要找到两个给定的在指定范围内的正整数的最大公约数。让我们通过例子来理解这个问题。我们将得到 4 个数字作为输入 x 和 y 来查找这些数字的 gcd 和两个指示 gcd 范围的数字,即 [p,q]。

输入:x=8、y=12、p=1、q=3

输出:2

解释 - 由于给定的两个数字 x 和 y 的最大公约数是 4。但是 4 不在范围 [1,3] 之内。 [1,3] 范围内的最大公约数是 2,这是我们所需的输出。

输入:x=17、y=15、a=5、b=10

输出:-1

解释 - 数字 17 和 15 的最大公约数是 1。因为 1 不在给定范围 [5,10] 内。当给定范围内没有公约数时,我们需要打印 -1 作为输出。

算法

我们用来解决问题的算法非常简单并且与数学相关。首先,我们将找到数字 x 和 y 的 gcd(最大公约数)。在 C++ 中,有一个名为 gcd() 的内置函数,它返回数字的最大公约数作为输出。

语法

int divisor=gcd(x,y);

我们还可以使用欧几里得算法的有效方法来查找两个数字的 gcd。两者同时工作,时间复杂度为 O(log(min(x,y))。

现在,我们可以使用简单的算术定律得出结论:除以两个数字的 gcd 的数字也将除以这两个数字本身。因此,在 for 循环中从 i=1 迭代到 sqrt(gcd(x,y)) 将帮助我们获得该数字的所有公约数。

然后,检查每个 i 直到 sqrt(gcd(x,y)) i 是否整除 gcd(x,y)。如果 i 除以 gcd(x,y),那么我们可以说 gcd(x,y)/i 也将是 gcd 的除数,从而得出结论,它也是数字 x 和 y 的公约数。

让我们通过一个例子来理解这个概念。假设 x 和 y 分别为 32 和 48。gcd(18,27) 为 16。所以在这种情况下,我们将从 i=1 迭代到 i

注意 - 如果数字 n 除以任意数字 x 得到 y,可以表示为 $\frac{n}{x}\:=\:y$ 那么 y 将将 n 除以 x $(x\:\times\:y\:=\:n)$。

该算法可能是解决该问题的最有效方法。在遵循这个算法的同时,我们将不断检查公约数是否在 [a,b] 范围内。如果不正确,我们将使用 max() 函数不断更新变量中的除数,以获得范围内的最大公约数。

Designs.ai
Designs.ai

AI设计工具

下载

max() 函数的语法

int m = max(a,b);

它返回 a 和 b 的最大值。

方法

以下是我们将遵循的方法 -

  • 初始化一个函数来计算给定范围内的最大公约数。

  • 计算两个给定正数 x 和 y 的 gcd。

  • 初始化变量名称 ans = -1。

  • 在 for 循环中从 i=1 迭代到 i

  • 如果 (gcd(x,y)%i)=0,检查 i 是否在 [a,b] 范围内,以及是否使用 max() 函数将其存储在 ans 中,以便我们得到最大公约数位于该范围内。

  • 同时检查 gcd/i 是否在范围内,如果在范围内,则再次使用 max() 函数更新 ans 的值。

  • 完成 for 循环中的所有迭代后返回 ans。

示例

该方法在 C++ 中的实现 -

#include
#include
using namespace std;

// to calculate gcd of two numbers using Euclidean algorithm
int gcd(int a, int b){
   if(a == 0)
   return b;
   return gcd(b % a, a);
}

//function to calculate greatest common divisor in the given range [a,b]
int build(int x, int y, int a, int b) {

   //using C++ inbuilt library to calculate gcd of given numbers
   int z = gcd(x, y); //we can use euclidean algorithm too as an alternative
   int ans = -1; //storing -1 for the case when no common divisor lies in the range
   for(int i = 1; i<=sqrt(z); i++) { //iterating until sqrt(z) because either of two factors
      //of a number must be less than square root of the number
      if(z % i == 0) {
         if(i >= a && i <= b) //checking it i lies in the range
         ans = max(ans, i); //storing maximum value
         if((z / i) >= a && (z / i) <= b)
         ans = max(ans, z / i);
      }
   }
   return ans;
}
int main() {
   int x, y, a, b;
   x=24, y=42, a=3, b=9;
   cout << build(x, y, a, b) <<" is the gcd that lies in range ["<

输出

6 is the gcd that lies in range [3,9]

时间复杂度:O(log(min(x,y)) + sqrt(z)),其中 z 是两个数字 x 和 y 的最大公约数。

空间复杂度:O(1),因为没有使用额外的空间。

结论

我们讨论了求解 [a,b] 范围内两个数的 gcd 问题的方法。这就是我们如何在 C++ 中使用各种不同的函数来解决上述问题。

我希望您觉得这篇文章很有帮助,并澄清您与该问题有关的所有概念。

相关专题

更多
高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

84

2026.01.16

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

24

2026.01.16

java数据库连接教程大全
java数据库连接教程大全

本专题整合了java数据库连接相关教程,阅读专题下面的文章了解更多详细内容。

35

2026.01.15

Java音频处理教程汇总
Java音频处理教程汇总

本专题整合了java音频处理教程大全,阅读专题下面的文章了解更多详细内容。

16

2026.01.15

windows查看wifi密码教程大全
windows查看wifi密码教程大全

本专题整合了windows查看wifi密码教程大全,阅读专题下面的文章了解更多详细内容。

56

2026.01.15

浏览器缓存清理方法汇总
浏览器缓存清理方法汇总

本专题整合了浏览器缓存清理教程汇总,阅读专题下面的文章了解更多详细内容。

16

2026.01.15

ps图片相关教程汇总
ps图片相关教程汇总

本专题整合了ps图片设置相关教程合集,阅读专题下面的文章了解更多详细内容。

9

2026.01.15

ppt一键生成相关合集
ppt一键生成相关合集

本专题整合了ppt一键生成相关教程汇总,阅读专题下面的的文章了解更多详细内容。

26

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Redis+MySQL数据库面试教程
Redis+MySQL数据库面试教程

共72课时 | 6.4万人学习

JavaScript函数与闭包
JavaScript函数与闭包

共32课时 | 4.3万人学习

尚学堂javascript视频教程第一季
尚学堂javascript视频教程第一季

共60课时 | 11.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号