算法与程序设计:第一篇 求两个整数的最大公约数

问题:求两个整数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;
}


        

猜你喜欢

转载自blog.csdn.net/biubiuxin/article/details/81125687