C++求两个数的最大公约数—更相减损法和枚举法

Posted 和球球一起学编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++求两个数的最大公约数—更相减损法和枚举法相关的知识,希望对你有一定的参考价值。

今天,我们来看看求最大公约数的另外两种方法—更相减损法和枚举法。

我们之前用Scratch编写过(点击链接可阅读)的程序。现在我们来看看如何用C++来编写。

【例】求a,b两数的最大公约数。

一、更相减损法

程序如下:

#include<iostream>#include<algorithm> using namespace std;int a,b;int gcd(int a,int b){ if(a==b) return b; if(a<b) swap(a,b);//如果a<b,则交换a,b以确保a>=b  return gcd(b,a-b);} int main(){ cin>>a>>b; cout<<gcd(a,b); return 0;}

更相减损法简单说就是如果a不等于b,就用a,b两数中较大的数减去较小的数,然后让a等于b,b等于a减b的差,重复执行直到a=b,此时的b为a,b两数的最大公约数。

上述C++程序中我们定义了求最大公约数的递归函数、调用了algorithm库中的swap函数。


下面我们来看看求最大公约数的另一种方法枚举法。


二、枚举法

我们知道对于两个整数a和b,它们共同的约数在1到min(a,b)之间,我们将这些数一一枚举,如果能同时整除a,b两个数并且是其中最大的,就是a,b两数的最大公约数。为了节约时间,我们可以从大到小枚举,这样第一个能同时整除a,b两数的数就是a,b的最大公约数。


#include<iostream>#include<algorithm>using namespace std;int a,b;int gcd(int a,int b){ int i; for(i=min(a,b);i>0;i--){ if(a%i==0 && b%i==0) break;//i能同时整除a,b时跳出循环   }//从大到小枚举i  return i;}int main(){ cin>>a>>b; cout<<gcd(a,b); return 0;}


引申:类似地我们可以用枚举法求a,b两数的最小公倍数。

关于用枚举法求两数的最小公倍数的方法我们将在下期进行讲解。


【C++】求两个数的最大公约数—更相减损法和枚举法


欢迎加入知识星球:球球小课堂 获取arduino相关程序源代码

(球球自己经营的知识星球,会不定时地分享其学习成果)

【C++】求两个数的最大公约数—更相减损法和枚举法


【C++】求两个数的最大公约数—更相减损法和枚举法


关注视频号:杨老师编程小课堂,欣赏更多arduino小作品




以上是关于C++求两个数的最大公约数—更相减损法和枚举法的主要内容,如果未能解决你的问题,请参考以下文章

最大公约数怎么算

求最大公因数(辗转相除,更相止损)C++描述

求最大公因数(辗转相除,更相止损)C++描述

求最大公因数(辗转相除,更相止损)C++描述

最大公约数与最小公倍数——求最小公倍数

更新减损术的Java实现