问题:求两个整数m,n(m>n)最大公约数。
1、欧几里得算法(辗转相除法)
(1)、 欧几里得算法的依据(一个定理):
gcd(m,n)=gcd(n,m mod n)
1) m除以n得余数r;若r=0;则n为所求的最大公约数;
2)若r≠0,以n为m,r为n,继续1)。
代码块1:
#include <iostream>
using namespace std;
/*构造函数gcd 求出最大公约数*/
int gcd(int a, int b)
{
if (b)
{
return gcd(b, a%b);
}
else
{
return a;
}
}
int main()
{
int m,n,c;
cout<<"请输入m,n的值:"<<endl;
cin>>m>>n;
c=gcd(m,n);
cout<<"m,n最大公约数为:"<<endl;
cout<<c<<endl;
system("pause");
return 0;
}
2、辗转相减法(更相减损法)
1)先判断m,n是否相等;相等,则结束程序,即m,n本身即为最大公约数;
2)若不相等,我们需要执行m>n和m<n两种情况下的语句;
3)若m>n,m=m-n;将结果返回1);
4)若m<n,n=n-m;将结果返回1);
5)循环执行上面语句直至m=n;循环结束。
代码块2:
/*构造函数rps 求出最大公约数*/
int rps(int a,int b)
{
while(a != b)
{
if(a>b)
{
a = a - b;
}
else
{
b = b - a;
}
}
return a;
}
ps:此函数插入代码块1即可使用,以后雷同。
3、穷举法
穷举法概念复杂,但理解起来却很简单,即在已知答案范围的情况下,依次地枚举该范围内所有的取值,并对每个取值进行计算和校验,确定是否满足条件。经过循环遍历之后,筛选出符合要求的结果来。这种方法充分利用了计算机运算速度快的特点,思路简单直接,能够解决大部分的问题。如:
(1)求1-100之间所有的素数;
(2)求2000-2018年间有几个月的13号是周日?
(3)验证1000以内的哥德巴赫猜想:即找出1000之内所有的合数,看是否能够分解为两个质数之和。
等。。。
详细见穷举法。
代码块3:
/*构造函数qiongju 求出最大公约数*/
int qiongju(int a,int b)
{
int c=0;
for(c=a;;c--)
if(a%c==0&&b%c==0)
break;
return c;
}