【C++解题报告】求最大公约数问题(辗转相除法)

题目来源:


    基础班《函数、递推、递归》,递归第5题。
    北大OJ-NOI 2.2基本算法之递归和自调用函数  7592

描述:
    
    总时间限制:1000ms  内存限制:65536KB
     给定两个正整数,求它们的最大公约数。

输入:
 
     输入一行,包含两个正整数(<1,000,000,000)。

输出:

       输出一个正整数,即这两个正整数的最大公约数。
 
样例输入:

 

6 9

 

样例输出:

3
 
提示:
 
求最大公约数可以使用辗转相除法:
假设a > b > 0,那么a和b的最大公约数等于b和a%b的最大公约数,然后把b和a%b作为新一轮的输入。
由于这个过程会一直递减,直到a%b等于0的时候,b的值就是所要求的最大公约数。
比如:
9和6的最大公约数等于6和9%6=3的最大公约数。
由于6%3==0,所以最大公约数为3。


题目思路:

      由题目的提示的,利用辗转相除法求最大公约数。辗转相除法:求a和b最大公约数,将a/b,如果a能整除b(a%b!=0),那么b就是a的最大公约数。如果不等于0,将b作为新的被除数,a/b的余数(a%b)作为新的除数。一直循环下去。这里定义一个函数gcd(Greatest common divisor),并进行递归调用。
      例如求24 和18的最大公约数: 

【C++解题报告】求最大公约数问题(辗转相除法)_第1张图片


代码:


using namespace std;

int gcd(int a,int b)       //定义函数gcd 计算 
{
	if(a%b==0)  
        return b;          // 如果a能整除b 则b为最大公约数 
    else                   
        return gcd(b,a%b); //如果不能整除,则将b作为新的被除数,a作为新的除数,    
} 

int main()                 //定义主函数 
{
	int a,b;               //定义变量 a,b 
	cin>>a>>b;             //输入 
	cout<



【C++解题报告】求最大公约数问题(辗转相除法)_第2张图片

【C++解题报告】求最大公约数问题(辗转相除法)_第3张图片

你可能感兴趣的:(【C++解题报告】求最大公约数问题(辗转相除法))